Merge branch 'new-linux-scripts' into linux
* Finished Python rewrite, ready for testing * (I think)
This commit is contained in:
commit
70e1655efe
76 changed files with 8103 additions and 7433 deletions
|
|
@ -1,62 +1,62 @@
|
||||||
# Wizard Kit: Activate Windows using various methods
|
# Wizard Kit: Activate Windows using various methods
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
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))
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: Windows Activation Tool\n'.format(KIT_NAME_FULL))
|
print_info('{}: Windows Activation Tool\n'.format(KIT_NAME_FULL))
|
||||||
# Bail early if already activated
|
# Bail early if already activated
|
||||||
if windows_is_activated():
|
if windows_is_activated():
|
||||||
print_info('This system is already activated')
|
print_info('This system is already activated')
|
||||||
sleep(5)
|
sleep(5)
|
||||||
exit_script()
|
exit_script()
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
'BIOSKeyNotFoundError': 'BIOS key not found.',
|
'BIOSKeyNotFoundError': 'BIOS key not found.',
|
||||||
}}
|
}}
|
||||||
|
|
||||||
# Determine activation method
|
# Determine activation method
|
||||||
activation_methods = [
|
activation_methods = [
|
||||||
{'Name': 'Activate with BIOS key', 'Function': activate_with_bios},
|
{'Name': 'Activate with BIOS key', 'Function': activate_with_bios},
|
||||||
]
|
]
|
||||||
if global_vars['OS']['Version'] not in ['8', '10']:
|
if global_vars['OS']['Version'] not in ['8', '10']:
|
||||||
activation_methods[0]['Disabled'] = True
|
activation_methods[0]['Disabled'] = True
|
||||||
actions = [
|
actions = [
|
||||||
{'Name': 'Quit', 'Letter': 'Q'},
|
{'Name': 'Quit', 'Letter': 'Q'},
|
||||||
]
|
]
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
selection = menu_select(
|
selection = menu_select(
|
||||||
'{}: Windows Activation Menu'.format(KIT_NAME_FULL),
|
'{}: Windows Activation Menu'.format(KIT_NAME_FULL),
|
||||||
main_entries=activation_methods, action_entries=actions)
|
main_entries=activation_methods, action_entries=actions)
|
||||||
|
|
||||||
if (selection.isnumeric()):
|
if (selection.isnumeric()):
|
||||||
result = try_and_print(
|
result = try_and_print(
|
||||||
message = activation_methods[int(selection)-1]['Name'],
|
message = activation_methods[int(selection)-1]['Name'],
|
||||||
function = activation_methods[int(selection)-1]['Function'],
|
function = activation_methods[int(selection)-1]['Function'],
|
||||||
other_results=other_results)
|
other_results=other_results)
|
||||||
if result['CS']:
|
if result['CS']:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
sleep(2)
|
sleep(2)
|
||||||
elif selection == 'Q':
|
elif selection == 'Q':
|
||||||
exit_script()
|
exit_script()
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
print_success('\nDone.')
|
print_success('\nDone.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
## HW diagnostics - Prime95
|
## Wizard Kit: Apple fan speed tool
|
||||||
|
|
||||||
SMCPATH="/sys/devices/platform/applesmc.768"
|
SMCPATH="/sys/devices/platform/applesmc.768"
|
||||||
SET_MAX="True"
|
SET_MAX="True"
|
||||||
|
|
||||||
function usage {
|
function usage {
|
||||||
echo "Usage: $0 auto|max"
|
echo "Usage: $(basename "$0") auto|max"
|
||||||
echo " e.g. $0 max"
|
echo " e.g. $(basename "$0") max"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Set mode
|
# Set mode
|
||||||
|
|
@ -1,57 +1,57 @@
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Code borrowed from https://github.com/aeruder/get_win8key
|
# Code borrowed from https://github.com/aeruder/get_win8key
|
||||||
|
|
||||||
if sys.platform.startswith('win32'):
|
if sys.platform.startswith('win32'):
|
||||||
import ctypes
|
import ctypes
|
||||||
import ctypes.wintypes
|
import ctypes.wintypes
|
||||||
|
|
||||||
def EnumAcpiTables():
|
def EnumAcpiTables():
|
||||||
#returns a list of the names of the ACPI tables on this system
|
#returns a list of the names of the ACPI tables on this system
|
||||||
FirmwareTableProviderSignature=ctypes.wintypes.DWORD(1094930505)
|
FirmwareTableProviderSignature=ctypes.wintypes.DWORD(1094930505)
|
||||||
pFirmwareTableBuffer=ctypes.create_string_buffer(0)
|
pFirmwareTableBuffer=ctypes.create_string_buffer(0)
|
||||||
BufferSize=ctypes.wintypes.DWORD(0)
|
BufferSize=ctypes.wintypes.DWORD(0)
|
||||||
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms724259
|
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms724259
|
||||||
EnumSystemFirmwareTables=ctypes.WinDLL("Kernel32").EnumSystemFirmwareTables
|
EnumSystemFirmwareTables=ctypes.WinDLL("Kernel32").EnumSystemFirmwareTables
|
||||||
ret=EnumSystemFirmwareTables(FirmwareTableProviderSignature, pFirmwareTableBuffer, BufferSize)
|
ret=EnumSystemFirmwareTables(FirmwareTableProviderSignature, pFirmwareTableBuffer, BufferSize)
|
||||||
pFirmwareTableBuffer=None
|
pFirmwareTableBuffer=None
|
||||||
pFirmwareTableBuffer=ctypes.create_string_buffer(ret)
|
pFirmwareTableBuffer=ctypes.create_string_buffer(ret)
|
||||||
BufferSize.value=ret
|
BufferSize.value=ret
|
||||||
ret2=EnumSystemFirmwareTables(FirmwareTableProviderSignature, pFirmwareTableBuffer, BufferSize)
|
ret2=EnumSystemFirmwareTables(FirmwareTableProviderSignature, pFirmwareTableBuffer, BufferSize)
|
||||||
return [pFirmwareTableBuffer.value[i:i+4] for i in range(0, len(pFirmwareTableBuffer.value), 4)]
|
return [pFirmwareTableBuffer.value[i:i+4] for i in range(0, len(pFirmwareTableBuffer.value), 4)]
|
||||||
|
|
||||||
def GetAcpiTable(table):
|
def GetAcpiTable(table):
|
||||||
#returns raw contents of ACPI table
|
#returns raw contents of ACPI table
|
||||||
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms724379x
|
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms724379x
|
||||||
tableID = 0
|
tableID = 0
|
||||||
for b in reversed(table):
|
for b in reversed(table):
|
||||||
tableID = (tableID << 8) + b
|
tableID = (tableID << 8) + b
|
||||||
GetSystemFirmwareTable=ctypes.WinDLL("Kernel32").GetSystemFirmwareTable
|
GetSystemFirmwareTable=ctypes.WinDLL("Kernel32").GetSystemFirmwareTable
|
||||||
FirmwareTableProviderSignature=ctypes.wintypes.DWORD(1094930505)
|
FirmwareTableProviderSignature=ctypes.wintypes.DWORD(1094930505)
|
||||||
FirmwareTableID=ctypes.wintypes.DWORD(int(tableID))
|
FirmwareTableID=ctypes.wintypes.DWORD(int(tableID))
|
||||||
pFirmwareTableBuffer=ctypes.create_string_buffer(0)
|
pFirmwareTableBuffer=ctypes.create_string_buffer(0)
|
||||||
BufferSize=ctypes.wintypes.DWORD(0)
|
BufferSize=ctypes.wintypes.DWORD(0)
|
||||||
ret = GetSystemFirmwareTable(FirmwareTableProviderSignature, FirmwareTableID, pFirmwareTableBuffer, BufferSize)
|
ret = GetSystemFirmwareTable(FirmwareTableProviderSignature, FirmwareTableID, pFirmwareTableBuffer, BufferSize)
|
||||||
pFirmwareTableBuffer=None
|
pFirmwareTableBuffer=None
|
||||||
pFirmwareTableBuffer=ctypes.create_string_buffer(ret)
|
pFirmwareTableBuffer=ctypes.create_string_buffer(ret)
|
||||||
BufferSize.value=ret
|
BufferSize.value=ret
|
||||||
ret2 = GetSystemFirmwareTable(FirmwareTableProviderSignature, FirmwareTableID, pFirmwareTableBuffer, BufferSize)
|
ret2 = GetSystemFirmwareTable(FirmwareTableProviderSignature, FirmwareTableID, pFirmwareTableBuffer, BufferSize)
|
||||||
return pFirmwareTableBuffer.raw
|
return pFirmwareTableBuffer.raw
|
||||||
elif sys.platform.startswith('linux'):
|
elif sys.platform.startswith('linux'):
|
||||||
import os
|
import os
|
||||||
TABLE_ROOT = b'/sys/firmware/acpi/tables'
|
TABLE_ROOT = b'/sys/firmware/acpi/tables'
|
||||||
def EnumAcpiTables():
|
def EnumAcpiTables():
|
||||||
return os.listdir(TABLE_ROOT)
|
return os.listdir(TABLE_ROOT)
|
||||||
def GetAcpiTable(table):
|
def GetAcpiTable(table):
|
||||||
with open(os.path.join(TABLE_ROOT, table), 'rb') as o:
|
with open(os.path.join(TABLE_ROOT, table), 'rb') as o:
|
||||||
return o.read()
|
return o.read()
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError('acpi support only implemented for linux and win32')
|
raise NotImplementedError('acpi support only implemented for linux and win32')
|
||||||
|
|
||||||
def FindAcpiTable(table):
|
def FindAcpiTable(table):
|
||||||
#checks if specific ACPI table exists and returns True/False
|
#checks if specific ACPI table exists and returns True/False
|
||||||
tables = EnumAcpiTables()
|
tables = EnumAcpiTables()
|
||||||
if table in tables:
|
if table in tables:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,21 @@
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2014 Michael Kropat
|
Copyright (c) 2014 Michael Kropat
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
in the Software without restriction, including without limitation the rights
|
in the Software without restriction, including without limitation the rights
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
furnished to do so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
The above copyright notice and this permission notice shall be included in
|
||||||
all copies or substantial portions of the Software.
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
|
|
|
||||||
|
|
@ -1,164 +1,164 @@
|
||||||
import ctypes, sys
|
import ctypes, sys
|
||||||
from ctypes import windll, wintypes
|
from ctypes import windll, wintypes
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
class GUID(ctypes.Structure): # [1]
|
class GUID(ctypes.Structure): # [1]
|
||||||
_fields_ = [
|
_fields_ = [
|
||||||
("Data1", wintypes.DWORD),
|
("Data1", wintypes.DWORD),
|
||||||
("Data2", wintypes.WORD),
|
("Data2", wintypes.WORD),
|
||||||
("Data3", wintypes.WORD),
|
("Data3", wintypes.WORD),
|
||||||
("Data4", wintypes.BYTE * 8)
|
("Data4", wintypes.BYTE * 8)
|
||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self, uuid_):
|
def __init__(self, uuid_):
|
||||||
ctypes.Structure.__init__(self)
|
ctypes.Structure.__init__(self)
|
||||||
self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid_.fields
|
self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid_.fields
|
||||||
for i in range(2, 8):
|
for i in range(2, 8):
|
||||||
self.Data4[i] = rest>>(8 - i - 1)*8 & 0xff
|
self.Data4[i] = rest>>(8 - i - 1)*8 & 0xff
|
||||||
|
|
||||||
class FOLDERID: # [2]
|
class FOLDERID: # [2]
|
||||||
AccountPictures = UUID('{008ca0b1-55b4-4c56-b8a8-4de4b299d3be}')
|
AccountPictures = UUID('{008ca0b1-55b4-4c56-b8a8-4de4b299d3be}')
|
||||||
AdminTools = UUID('{724EF170-A42D-4FEF-9F26-B60E846FBA4F}')
|
AdminTools = UUID('{724EF170-A42D-4FEF-9F26-B60E846FBA4F}')
|
||||||
ApplicationShortcuts = UUID('{A3918781-E5F2-4890-B3D9-A7E54332328C}')
|
ApplicationShortcuts = UUID('{A3918781-E5F2-4890-B3D9-A7E54332328C}')
|
||||||
CameraRoll = UUID('{AB5FB87B-7CE2-4F83-915D-550846C9537B}')
|
CameraRoll = UUID('{AB5FB87B-7CE2-4F83-915D-550846C9537B}')
|
||||||
CDBurning = UUID('{9E52AB10-F80D-49DF-ACB8-4330F5687855}')
|
CDBurning = UUID('{9E52AB10-F80D-49DF-ACB8-4330F5687855}')
|
||||||
CommonAdminTools = UUID('{D0384E7D-BAC3-4797-8F14-CBA229B392B5}')
|
CommonAdminTools = UUID('{D0384E7D-BAC3-4797-8F14-CBA229B392B5}')
|
||||||
CommonOEMLinks = UUID('{C1BAE2D0-10DF-4334-BEDD-7AA20B227A9D}')
|
CommonOEMLinks = UUID('{C1BAE2D0-10DF-4334-BEDD-7AA20B227A9D}')
|
||||||
CommonPrograms = UUID('{0139D44E-6AFE-49F2-8690-3DAFCAE6FFB8}')
|
CommonPrograms = UUID('{0139D44E-6AFE-49F2-8690-3DAFCAE6FFB8}')
|
||||||
CommonStartMenu = UUID('{A4115719-D62E-491D-AA7C-E74B8BE3B067}')
|
CommonStartMenu = UUID('{A4115719-D62E-491D-AA7C-E74B8BE3B067}')
|
||||||
CommonStartup = UUID('{82A5EA35-D9CD-47C5-9629-E15D2F714E6E}')
|
CommonStartup = UUID('{82A5EA35-D9CD-47C5-9629-E15D2F714E6E}')
|
||||||
CommonTemplates = UUID('{B94237E7-57AC-4347-9151-B08C6C32D1F7}')
|
CommonTemplates = UUID('{B94237E7-57AC-4347-9151-B08C6C32D1F7}')
|
||||||
Contacts = UUID('{56784854-C6CB-462b-8169-88E350ACB882}')
|
Contacts = UUID('{56784854-C6CB-462b-8169-88E350ACB882}')
|
||||||
Cookies = UUID('{2B0F765D-C0E9-4171-908E-08A611B84FF6}')
|
Cookies = UUID('{2B0F765D-C0E9-4171-908E-08A611B84FF6}')
|
||||||
Desktop = UUID('{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}')
|
Desktop = UUID('{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}')
|
||||||
DeviceMetadataStore = UUID('{5CE4A5E9-E4EB-479D-B89F-130C02886155}')
|
DeviceMetadataStore = UUID('{5CE4A5E9-E4EB-479D-B89F-130C02886155}')
|
||||||
Documents = UUID('{FDD39AD0-238F-46AF-ADB4-6C85480369C7}')
|
Documents = UUID('{FDD39AD0-238F-46AF-ADB4-6C85480369C7}')
|
||||||
DocumentsLibrary = UUID('{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}')
|
DocumentsLibrary = UUID('{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}')
|
||||||
Downloads = UUID('{374DE290-123F-4565-9164-39C4925E467B}')
|
Downloads = UUID('{374DE290-123F-4565-9164-39C4925E467B}')
|
||||||
Favorites = UUID('{1777F761-68AD-4D8A-87BD-30B759FA33DD}')
|
Favorites = UUID('{1777F761-68AD-4D8A-87BD-30B759FA33DD}')
|
||||||
Fonts = UUID('{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}')
|
Fonts = UUID('{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}')
|
||||||
GameTasks = UUID('{054FAE61-4DD8-4787-80B6-090220C4B700}')
|
GameTasks = UUID('{054FAE61-4DD8-4787-80B6-090220C4B700}')
|
||||||
History = UUID('{D9DC8A3B-B784-432E-A781-5A1130A75963}')
|
History = UUID('{D9DC8A3B-B784-432E-A781-5A1130A75963}')
|
||||||
ImplicitAppShortcuts = UUID('{BCB5256F-79F6-4CEE-B725-DC34E402FD46}')
|
ImplicitAppShortcuts = UUID('{BCB5256F-79F6-4CEE-B725-DC34E402FD46}')
|
||||||
InternetCache = UUID('{352481E8-33BE-4251-BA85-6007CAEDCF9D}')
|
InternetCache = UUID('{352481E8-33BE-4251-BA85-6007CAEDCF9D}')
|
||||||
Libraries = UUID('{1B3EA5DC-B587-4786-B4EF-BD1DC332AEAE}')
|
Libraries = UUID('{1B3EA5DC-B587-4786-B4EF-BD1DC332AEAE}')
|
||||||
Links = UUID('{bfb9d5e0-c6a9-404c-b2b2-ae6db6af4968}')
|
Links = UUID('{bfb9d5e0-c6a9-404c-b2b2-ae6db6af4968}')
|
||||||
LocalAppData = UUID('{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}')
|
LocalAppData = UUID('{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}')
|
||||||
LocalAppDataLow = UUID('{A520A1A4-1780-4FF6-BD18-167343C5AF16}')
|
LocalAppDataLow = UUID('{A520A1A4-1780-4FF6-BD18-167343C5AF16}')
|
||||||
LocalizedResourcesDir = UUID('{2A00375E-224C-49DE-B8D1-440DF7EF3DDC}')
|
LocalizedResourcesDir = UUID('{2A00375E-224C-49DE-B8D1-440DF7EF3DDC}')
|
||||||
Music = UUID('{4BD8D571-6D19-48D3-BE97-422220080E43}')
|
Music = UUID('{4BD8D571-6D19-48D3-BE97-422220080E43}')
|
||||||
MusicLibrary = UUID('{2112AB0A-C86A-4FFE-A368-0DE96E47012E}')
|
MusicLibrary = UUID('{2112AB0A-C86A-4FFE-A368-0DE96E47012E}')
|
||||||
NetHood = UUID('{C5ABBF53-E17F-4121-8900-86626FC2C973}')
|
NetHood = UUID('{C5ABBF53-E17F-4121-8900-86626FC2C973}')
|
||||||
OriginalImages = UUID('{2C36C0AA-5812-4b87-BFD0-4CD0DFB19B39}')
|
OriginalImages = UUID('{2C36C0AA-5812-4b87-BFD0-4CD0DFB19B39}')
|
||||||
PhotoAlbums = UUID('{69D2CF90-FC33-4FB7-9A0C-EBB0F0FCB43C}')
|
PhotoAlbums = UUID('{69D2CF90-FC33-4FB7-9A0C-EBB0F0FCB43C}')
|
||||||
PicturesLibrary = UUID('{A990AE9F-A03B-4E80-94BC-9912D7504104}')
|
PicturesLibrary = UUID('{A990AE9F-A03B-4E80-94BC-9912D7504104}')
|
||||||
Pictures = UUID('{33E28130-4E1E-4676-835A-98395C3BC3BB}')
|
Pictures = UUID('{33E28130-4E1E-4676-835A-98395C3BC3BB}')
|
||||||
Playlists = UUID('{DE92C1C7-837F-4F69-A3BB-86E631204A23}')
|
Playlists = UUID('{DE92C1C7-837F-4F69-A3BB-86E631204A23}')
|
||||||
PrintHood = UUID('{9274BD8D-CFD1-41C3-B35E-B13F55A758F4}')
|
PrintHood = UUID('{9274BD8D-CFD1-41C3-B35E-B13F55A758F4}')
|
||||||
Profile = UUID('{5E6C858F-0E22-4760-9AFE-EA3317B67173}')
|
Profile = UUID('{5E6C858F-0E22-4760-9AFE-EA3317B67173}')
|
||||||
ProgramData = UUID('{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}')
|
ProgramData = UUID('{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}')
|
||||||
ProgramFiles = UUID('{905e63b6-c1bf-494e-b29c-65b732d3d21a}')
|
ProgramFiles = UUID('{905e63b6-c1bf-494e-b29c-65b732d3d21a}')
|
||||||
ProgramFilesX64 = UUID('{6D809377-6AF0-444b-8957-A3773F02200E}')
|
ProgramFilesX64 = UUID('{6D809377-6AF0-444b-8957-A3773F02200E}')
|
||||||
ProgramFilesX86 = UUID('{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}')
|
ProgramFilesX86 = UUID('{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}')
|
||||||
ProgramFilesCommon = UUID('{F7F1ED05-9F6D-47A2-AAAE-29D317C6F066}')
|
ProgramFilesCommon = UUID('{F7F1ED05-9F6D-47A2-AAAE-29D317C6F066}')
|
||||||
ProgramFilesCommonX64 = UUID('{6365D5A7-0F0D-45E5-87F6-0DA56B6A4F7D}')
|
ProgramFilesCommonX64 = UUID('{6365D5A7-0F0D-45E5-87F6-0DA56B6A4F7D}')
|
||||||
ProgramFilesCommonX86 = UUID('{DE974D24-D9C6-4D3E-BF91-F4455120B917}')
|
ProgramFilesCommonX86 = UUID('{DE974D24-D9C6-4D3E-BF91-F4455120B917}')
|
||||||
Programs = UUID('{A77F5D77-2E2B-44C3-A6A2-ABA601054A51}')
|
Programs = UUID('{A77F5D77-2E2B-44C3-A6A2-ABA601054A51}')
|
||||||
Public = UUID('{DFDF76A2-C82A-4D63-906A-5644AC457385}')
|
Public = UUID('{DFDF76A2-C82A-4D63-906A-5644AC457385}')
|
||||||
PublicDesktop = UUID('{C4AA340D-F20F-4863-AFEF-F87EF2E6BA25}')
|
PublicDesktop = UUID('{C4AA340D-F20F-4863-AFEF-F87EF2E6BA25}')
|
||||||
PublicDocuments = UUID('{ED4824AF-DCE4-45A8-81E2-FC7965083634}')
|
PublicDocuments = UUID('{ED4824AF-DCE4-45A8-81E2-FC7965083634}')
|
||||||
PublicDownloads = UUID('{3D644C9B-1FB8-4f30-9B45-F670235F79C0}')
|
PublicDownloads = UUID('{3D644C9B-1FB8-4f30-9B45-F670235F79C0}')
|
||||||
PublicGameTasks = UUID('{DEBF2536-E1A8-4c59-B6A2-414586476AEA}')
|
PublicGameTasks = UUID('{DEBF2536-E1A8-4c59-B6A2-414586476AEA}')
|
||||||
PublicLibraries = UUID('{48DAF80B-E6CF-4F4E-B800-0E69D84EE384}')
|
PublicLibraries = UUID('{48DAF80B-E6CF-4F4E-B800-0E69D84EE384}')
|
||||||
PublicMusic = UUID('{3214FAB5-9757-4298-BB61-92A9DEAA44FF}')
|
PublicMusic = UUID('{3214FAB5-9757-4298-BB61-92A9DEAA44FF}')
|
||||||
PublicPictures = UUID('{B6EBFB86-6907-413C-9AF7-4FC2ABF07CC5}')
|
PublicPictures = UUID('{B6EBFB86-6907-413C-9AF7-4FC2ABF07CC5}')
|
||||||
PublicRingtones = UUID('{E555AB60-153B-4D17-9F04-A5FE99FC15EC}')
|
PublicRingtones = UUID('{E555AB60-153B-4D17-9F04-A5FE99FC15EC}')
|
||||||
PublicUserTiles = UUID('{0482af6c-08f1-4c34-8c90-e17ec98b1e17}')
|
PublicUserTiles = UUID('{0482af6c-08f1-4c34-8c90-e17ec98b1e17}')
|
||||||
PublicVideos = UUID('{2400183A-6185-49FB-A2D8-4A392A602BA3}')
|
PublicVideos = UUID('{2400183A-6185-49FB-A2D8-4A392A602BA3}')
|
||||||
QuickLaunch = UUID('{52a4f021-7b75-48a9-9f6b-4b87a210bc8f}')
|
QuickLaunch = UUID('{52a4f021-7b75-48a9-9f6b-4b87a210bc8f}')
|
||||||
Recent = UUID('{AE50C081-EBD2-438A-8655-8A092E34987A}')
|
Recent = UUID('{AE50C081-EBD2-438A-8655-8A092E34987A}')
|
||||||
RecordedTVLibrary = UUID('{1A6FDBA2-F42D-4358-A798-B74D745926C5}')
|
RecordedTVLibrary = UUID('{1A6FDBA2-F42D-4358-A798-B74D745926C5}')
|
||||||
ResourceDir = UUID('{8AD10C31-2ADB-4296-A8F7-E4701232C972}')
|
ResourceDir = UUID('{8AD10C31-2ADB-4296-A8F7-E4701232C972}')
|
||||||
Ringtones = UUID('{C870044B-F49E-4126-A9C3-B52A1FF411E8}')
|
Ringtones = UUID('{C870044B-F49E-4126-A9C3-B52A1FF411E8}')
|
||||||
RoamingAppData = UUID('{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}')
|
RoamingAppData = UUID('{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}')
|
||||||
RoamedTileImages = UUID('{AAA8D5A5-F1D6-4259-BAA8-78E7EF60835E}')
|
RoamedTileImages = UUID('{AAA8D5A5-F1D6-4259-BAA8-78E7EF60835E}')
|
||||||
RoamingTiles = UUID('{00BCFC5A-ED94-4e48-96A1-3F6217F21990}')
|
RoamingTiles = UUID('{00BCFC5A-ED94-4e48-96A1-3F6217F21990}')
|
||||||
SampleMusic = UUID('{B250C668-F57D-4EE1-A63C-290EE7D1AA1F}')
|
SampleMusic = UUID('{B250C668-F57D-4EE1-A63C-290EE7D1AA1F}')
|
||||||
SamplePictures = UUID('{C4900540-2379-4C75-844B-64E6FAF8716B}')
|
SamplePictures = UUID('{C4900540-2379-4C75-844B-64E6FAF8716B}')
|
||||||
SamplePlaylists = UUID('{15CA69B3-30EE-49C1-ACE1-6B5EC372AFB5}')
|
SamplePlaylists = UUID('{15CA69B3-30EE-49C1-ACE1-6B5EC372AFB5}')
|
||||||
SampleVideos = UUID('{859EAD94-2E85-48AD-A71A-0969CB56A6CD}')
|
SampleVideos = UUID('{859EAD94-2E85-48AD-A71A-0969CB56A6CD}')
|
||||||
SavedGames = UUID('{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}')
|
SavedGames = UUID('{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}')
|
||||||
SavedSearches = UUID('{7d1d3a04-debb-4115-95cf-2f29da2920da}')
|
SavedSearches = UUID('{7d1d3a04-debb-4115-95cf-2f29da2920da}')
|
||||||
Screenshots = UUID('{b7bede81-df94-4682-a7d8-57a52620b86f}')
|
Screenshots = UUID('{b7bede81-df94-4682-a7d8-57a52620b86f}')
|
||||||
SearchHistory = UUID('{0D4C3DB6-03A3-462F-A0E6-08924C41B5D4}')
|
SearchHistory = UUID('{0D4C3DB6-03A3-462F-A0E6-08924C41B5D4}')
|
||||||
SearchTemplates = UUID('{7E636BFE-DFA9-4D5E-B456-D7B39851D8A9}')
|
SearchTemplates = UUID('{7E636BFE-DFA9-4D5E-B456-D7B39851D8A9}')
|
||||||
SendTo = UUID('{8983036C-27C0-404B-8F08-102D10DCFD74}')
|
SendTo = UUID('{8983036C-27C0-404B-8F08-102D10DCFD74}')
|
||||||
SidebarDefaultParts = UUID('{7B396E54-9EC5-4300-BE0A-2482EBAE1A26}')
|
SidebarDefaultParts = UUID('{7B396E54-9EC5-4300-BE0A-2482EBAE1A26}')
|
||||||
SidebarParts = UUID('{A75D362E-50FC-4fb7-AC2C-A8BEAA314493}')
|
SidebarParts = UUID('{A75D362E-50FC-4fb7-AC2C-A8BEAA314493}')
|
||||||
SkyDrive = UUID('{A52BBA46-E9E1-435f-B3D9-28DAA648C0F6}')
|
SkyDrive = UUID('{A52BBA46-E9E1-435f-B3D9-28DAA648C0F6}')
|
||||||
SkyDriveCameraRoll = UUID('{767E6811-49CB-4273-87C2-20F355E1085B}')
|
SkyDriveCameraRoll = UUID('{767E6811-49CB-4273-87C2-20F355E1085B}')
|
||||||
SkyDriveDocuments = UUID('{24D89E24-2F19-4534-9DDE-6A6671FBB8FE}')
|
SkyDriveDocuments = UUID('{24D89E24-2F19-4534-9DDE-6A6671FBB8FE}')
|
||||||
SkyDrivePictures = UUID('{339719B5-8C47-4894-94C2-D8F77ADD44A6}')
|
SkyDrivePictures = UUID('{339719B5-8C47-4894-94C2-D8F77ADD44A6}')
|
||||||
StartMenu = UUID('{625B53C3-AB48-4EC1-BA1F-A1EF4146FC19}')
|
StartMenu = UUID('{625B53C3-AB48-4EC1-BA1F-A1EF4146FC19}')
|
||||||
Startup = UUID('{B97D20BB-F46A-4C97-BA10-5E3608430854}')
|
Startup = UUID('{B97D20BB-F46A-4C97-BA10-5E3608430854}')
|
||||||
System = UUID('{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}')
|
System = UUID('{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}')
|
||||||
SystemX86 = UUID('{D65231B0-B2F1-4857-A4CE-A8E7C6EA7D27}')
|
SystemX86 = UUID('{D65231B0-B2F1-4857-A4CE-A8E7C6EA7D27}')
|
||||||
Templates = UUID('{A63293E8-664E-48DB-A079-DF759E0509F7}')
|
Templates = UUID('{A63293E8-664E-48DB-A079-DF759E0509F7}')
|
||||||
UserPinned = UUID('{9E3995AB-1F9C-4F13-B827-48B24B6C7174}')
|
UserPinned = UUID('{9E3995AB-1F9C-4F13-B827-48B24B6C7174}')
|
||||||
UserProfiles = UUID('{0762D272-C50A-4BB0-A382-697DCD729B80}')
|
UserProfiles = UUID('{0762D272-C50A-4BB0-A382-697DCD729B80}')
|
||||||
UserProgramFiles = UUID('{5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}')
|
UserProgramFiles = UUID('{5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}')
|
||||||
UserProgramFilesCommon = UUID('{BCBD3057-CA5C-4622-B42D-BC56DB0AE516}')
|
UserProgramFilesCommon = UUID('{BCBD3057-CA5C-4622-B42D-BC56DB0AE516}')
|
||||||
Videos = UUID('{18989B1D-99B5-455B-841C-AB7C74E4DDFC}')
|
Videos = UUID('{18989B1D-99B5-455B-841C-AB7C74E4DDFC}')
|
||||||
VideosLibrary = UUID('{491E922F-5643-4AF4-A7EB-4E7A138D8174}')
|
VideosLibrary = UUID('{491E922F-5643-4AF4-A7EB-4E7A138D8174}')
|
||||||
Windows = UUID('{F38BF404-1D43-42F2-9305-67DE0B28FC23}')
|
Windows = UUID('{F38BF404-1D43-42F2-9305-67DE0B28FC23}')
|
||||||
|
|
||||||
class UserHandle: # [3]
|
class UserHandle: # [3]
|
||||||
current = wintypes.HANDLE(0)
|
current = wintypes.HANDLE(0)
|
||||||
common = wintypes.HANDLE(-1)
|
common = wintypes.HANDLE(-1)
|
||||||
|
|
||||||
_CoTaskMemFree = windll.ole32.CoTaskMemFree # [4]
|
_CoTaskMemFree = windll.ole32.CoTaskMemFree # [4]
|
||||||
_CoTaskMemFree.restype= None
|
_CoTaskMemFree.restype= None
|
||||||
_CoTaskMemFree.argtypes = [ctypes.c_void_p]
|
_CoTaskMemFree.argtypes = [ctypes.c_void_p]
|
||||||
|
|
||||||
_SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath # [5] [3]
|
_SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath # [5] [3]
|
||||||
_SHGetKnownFolderPath.argtypes = [
|
_SHGetKnownFolderPath.argtypes = [
|
||||||
ctypes.POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, ctypes.POINTER(ctypes.c_wchar_p)
|
ctypes.POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, ctypes.POINTER(ctypes.c_wchar_p)
|
||||||
]
|
]
|
||||||
|
|
||||||
class PathNotFoundException(Exception): pass
|
class PathNotFoundException(Exception): pass
|
||||||
|
|
||||||
def get_path(folderid, user_handle=UserHandle.common):
|
def get_path(folderid, user_handle=UserHandle.common):
|
||||||
fid = GUID(folderid)
|
fid = GUID(folderid)
|
||||||
pPath = ctypes.c_wchar_p()
|
pPath = ctypes.c_wchar_p()
|
||||||
S_OK = 0
|
S_OK = 0
|
||||||
if _SHGetKnownFolderPath(ctypes.byref(fid), 0, user_handle, ctypes.byref(pPath)) != S_OK:
|
if _SHGetKnownFolderPath(ctypes.byref(fid), 0, user_handle, ctypes.byref(pPath)) != S_OK:
|
||||||
raise PathNotFoundException()
|
raise PathNotFoundException()
|
||||||
path = pPath.value
|
path = pPath.value
|
||||||
_CoTaskMemFree(pPath)
|
_CoTaskMemFree(pPath)
|
||||||
return path
|
return path
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
if len(sys.argv) < 2 or sys.argv[1] in ['-?', '/?']:
|
if len(sys.argv) < 2 or sys.argv[1] in ['-?', '/?']:
|
||||||
print('python knownpaths.py FOLDERID {current|common}')
|
print('python knownpaths.py FOLDERID {current|common}')
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
folderid = getattr(FOLDERID, sys.argv[1])
|
folderid = getattr(FOLDERID, sys.argv[1])
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
print('Unknown folder id "%s"' % sys.argv[1], file=sys.stderr)
|
print('Unknown folder id "%s"' % sys.argv[1], file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if len(sys.argv) == 2:
|
if len(sys.argv) == 2:
|
||||||
print(get_path(folderid))
|
print(get_path(folderid))
|
||||||
else:
|
else:
|
||||||
print(get_path(folderid, getattr(UserHandle, sys.argv[2])))
|
print(get_path(folderid, getattr(UserHandle, sys.argv[2])))
|
||||||
except PathNotFoundException:
|
except PathNotFoundException:
|
||||||
print('Folder not found "%s"' % ' '.join(sys.argv[1:]), file=sys.stderr)
|
print('Folder not found "%s"' % ' '.join(sys.argv[1:]), file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# [1] http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx
|
# [1] http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx
|
||||||
# [2] http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx
|
# [2] http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx
|
||||||
# [3] http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx
|
# [3] http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx
|
||||||
# [4] http://msdn.microsoft.com/en-us/library/windows/desktop/ms680722.aspx
|
# [4] http://msdn.microsoft.com/en-us/library/windows/desktop/ms680722.aspx
|
||||||
# [5] http://www.themacaque.com/?p=954
|
# [5] http://www.themacaque.com/?p=954
|
||||||
|
|
|
||||||
35
.bin/Scripts/borrowed/sensors-README.md
Normal file
35
.bin/Scripts/borrowed/sensors-README.md
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
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
|
||||||
236
.bin/Scripts/borrowed/sensors.py
Normal file
236
.bin/Scripts/borrowed/sensors.py
Normal file
|
|
@ -0,0 +1,236 @@
|
||||||
|
"""
|
||||||
|
@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,42 +1,42 @@
|
||||||
# Wizard Kit: Backup CBS Logs and prep CBS temp data for deletion
|
# Wizard Kit: Backup CBS Logs and prep CBS temp data for deletion
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
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)
|
global_vars['LogFile'] = r'{LogDir}\CBS Cleanup.log'.format(**global_vars)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
# Prep
|
# Prep
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
folder_path = r'{}\Backups'.format(KIT_NAME_SHORT)
|
folder_path = r'{}\Backups'.format(KIT_NAME_SHORT)
|
||||||
dest = select_destination(folder_path=folder_path,
|
dest = select_destination(folder_path=folder_path,
|
||||||
prompt='Which disk are we using for temp data and backup?')
|
prompt='Which disk are we using for temp data and backup?')
|
||||||
|
|
||||||
# Show details
|
# Show details
|
||||||
print_info('{}: CBS Cleanup Tool\n'.format(KIT_NAME_FULL))
|
print_info('{}: CBS Cleanup Tool\n'.format(KIT_NAME_FULL))
|
||||||
show_info('Backup / Temp path:', dest)
|
show_info('Backup / Temp path:', dest)
|
||||||
print_standard('\n')
|
print_standard('\n')
|
||||||
if (not ask('Proceed with CBS cleanup?')):
|
if (not ask('Proceed with CBS cleanup?')):
|
||||||
abort()
|
abort()
|
||||||
|
|
||||||
# Run Cleanup
|
# Run Cleanup
|
||||||
try_and_print(message='Running cleanup...', function=cleanup_cbs,
|
try_and_print(message='Running cleanup...', function=cleanup_cbs,
|
||||||
cs='Done', dest_folder=dest)
|
cs='Done', dest_folder=dest)
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,56 +1,56 @@
|
||||||
# Wizard Kit: Check or repair the %SYSTEMDRIVE% filesystem via CHKDSK
|
# Wizard Kit: Check or repair the %SYSTEMDRIVE% filesystem via CHKDSK
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
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)
|
global_vars['LogFile'] = r'{LogDir}\Check Disk.log'.format(**global_vars)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
'CalledProcessError': 'Unknown Error',
|
'CalledProcessError': 'Unknown Error',
|
||||||
},
|
},
|
||||||
'Warning': {
|
'Warning': {
|
||||||
'GenericRepair': 'Repaired',
|
'GenericRepair': 'Repaired',
|
||||||
'UnsupportedOSError': 'Unsupported OS',
|
'UnsupportedOSError': 'Unsupported OS',
|
||||||
}}
|
}}
|
||||||
options = [
|
options = [
|
||||||
{'Name': 'Run CHKDSK scan (read-only)', 'Repair': False},
|
{'Name': 'Run CHKDSK scan (read-only)', 'Repair': False},
|
||||||
{'Name': 'Schedule CHKDSK scan (offline repair)', 'Repair': True}]
|
{'Name': 'Schedule CHKDSK scan (offline repair)', 'Repair': True}]
|
||||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||||
selection = menu_select(
|
selection = menu_select(
|
||||||
'{}: Check Disk Menu\n'.format(KIT_NAME_FULL),
|
'{}: Check Disk Menu\n'.format(KIT_NAME_FULL),
|
||||||
main_entries=options,
|
main_entries=options,
|
||||||
action_entries=actions)
|
action_entries=actions)
|
||||||
print_info('{}: Check Disk Menu\n'.format(KIT_NAME_FULL))
|
print_info('{}: Check Disk Menu\n'.format(KIT_NAME_FULL))
|
||||||
if selection == 'Q':
|
if selection == 'Q':
|
||||||
abort()
|
abort()
|
||||||
elif selection.isnumeric():
|
elif selection.isnumeric():
|
||||||
repair = options[int(selection)-1]['Repair']
|
repair = options[int(selection)-1]['Repair']
|
||||||
if repair:
|
if repair:
|
||||||
cs = 'Scheduled'
|
cs = 'Scheduled'
|
||||||
else:
|
else:
|
||||||
cs = 'CS'
|
cs = 'CS'
|
||||||
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)
|
||||||
else:
|
else:
|
||||||
abort()
|
abort()
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
print_success('Done.')
|
print_success('Done.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
30
.bin/Scripts/connect-to-network
Executable file
30
.bin/Scripts/connect-to-network
Executable file
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/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()
|
||||||
|
|
||||||
|
|
@ -1,57 +1,57 @@
|
||||||
# Wizard Kit: Check or repair component store health via DISM
|
# Wizard Kit: Check or repair component store health via DISM
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
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)
|
global_vars['LogFile'] = r'{LogDir}\DISM helper tool.log'.format(**global_vars)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
'CalledProcessError': 'Unknown Error',
|
'CalledProcessError': 'Unknown Error',
|
||||||
},
|
},
|
||||||
'Warning': {
|
'Warning': {
|
||||||
'GenericRepair': 'Repaired',
|
'GenericRepair': 'Repaired',
|
||||||
'UnsupportedOSError': 'Unsupported OS',
|
'UnsupportedOSError': 'Unsupported OS',
|
||||||
}}
|
}}
|
||||||
disabled = bool(global_vars['OS']['Version'] not in ['8', '10'])
|
disabled = bool(global_vars['OS']['Version'] not in ['8', '10'])
|
||||||
options = [
|
options = [
|
||||||
{'Name': 'Check Health', 'Repair': False, 'Disabled': disabled},
|
{'Name': 'Check Health', 'Repair': False, 'Disabled': disabled},
|
||||||
{'Name': 'Restore Health', 'Repair': True, 'Disabled': disabled}]
|
{'Name': 'Restore Health', 'Repair': True, 'Disabled': disabled}]
|
||||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||||
selection = menu_select(
|
selection = menu_select(
|
||||||
'{}: DISM Menu\n'.format(KIT_NAME_FULL),
|
'{}: DISM Menu\n'.format(KIT_NAME_FULL),
|
||||||
main_entries=options,
|
main_entries=options,
|
||||||
action_entries=actions)
|
action_entries=actions)
|
||||||
print_info('{}: DISM Menu\n'.format(KIT_NAME_FULL))
|
print_info('{}: DISM Menu\n'.format(KIT_NAME_FULL))
|
||||||
if selection == 'Q':
|
if selection == 'Q':
|
||||||
abort()
|
abort()
|
||||||
elif selection.isnumeric():
|
elif selection.isnumeric():
|
||||||
repair = options[int(selection)-1]['Repair']
|
repair = options[int(selection)-1]['Repair']
|
||||||
if repair:
|
if repair:
|
||||||
message='DISM RestoreHealth...'
|
message='DISM RestoreHealth...'
|
||||||
else:
|
else:
|
||||||
message='DISM ScanHealth...'
|
message='DISM ScanHealth...'
|
||||||
try_and_print(message=message, function=run_dism,
|
try_and_print(message=message, function=run_dism,
|
||||||
cs='No corruption', ns='Corruption detected',
|
cs='No corruption', ns='Corruption detected',
|
||||||
other_results=other_results, repair=repair)
|
other_results=other_results, repair=repair)
|
||||||
else:
|
else:
|
||||||
abort()
|
abort()
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
print_success('Done.')
|
print_success('Done.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,66 +1,66 @@
|
||||||
# Wizard Kit: Functions - Activation
|
# Wizard Kit: Functions - Activation
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
from borrowed import acpi
|
from borrowed import acpi
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
from os import environ
|
from os import environ
|
||||||
|
|
||||||
# Variables
|
# 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
|
||||||
#####################################################
|
#####################################################
|
||||||
#script to query windows 8.x OEM key from PC firmware
|
#script to query windows 8.x OEM key from PC firmware
|
||||||
#ACPI -> table MSDM -> raw content -> byte offset 56 to end
|
#ACPI -> table MSDM -> raw content -> byte offset 56 to end
|
||||||
#ck, 03-Jan-2014 (christian@korneck.de)
|
#ck, 03-Jan-2014 (christian@korneck.de)
|
||||||
#####################################################
|
#####################################################
|
||||||
bios_key = None
|
bios_key = None
|
||||||
table = b"MSDM"
|
table = b"MSDM"
|
||||||
if acpi.FindAcpiTable(table) is True:
|
if acpi.FindAcpiTable(table) is True:
|
||||||
rawtable = acpi.GetAcpiTable(table)
|
rawtable = acpi.GetAcpiTable(table)
|
||||||
#http://msdn.microsoft.com/library/windows/hardware/hh673514
|
#http://msdn.microsoft.com/library/windows/hardware/hh673514
|
||||||
#byte offset 36 from beginning \
|
#byte offset 36 from beginning \
|
||||||
# = Microsoft 'software licensing data structure' \
|
# = Microsoft 'software licensing data structure' \
|
||||||
# / 36 + 20 bytes offset from beginning = Win Key
|
# / 36 + 20 bytes offset from beginning = Win Key
|
||||||
bios_key = rawtable[56:len(rawtable)].decode("utf-8")
|
bios_key = rawtable[56:len(rawtable)].decode("utf-8")
|
||||||
if bios_key is None:
|
if bios_key is None:
|
||||||
raise BIOSKeyNotFoundError
|
raise BIOSKeyNotFoundError
|
||||||
|
|
||||||
# Install Key
|
# Install Key
|
||||||
cmd = ['cscript', '//nologo', SLMGR, '/ipk', bios_key]
|
cmd = ['cscript', '//nologo', SLMGR, '/ipk', bios_key]
|
||||||
subprocess.run(cmd, check=False)
|
subprocess.run(cmd, check=False)
|
||||||
sleep(5)
|
sleep(5)
|
||||||
|
|
||||||
# Attempt activation
|
# Attempt activation
|
||||||
cmd = ['cscript', '//nologo', SLMGR, '/ato']
|
cmd = ['cscript', '//nologo', SLMGR, '/ato']
|
||||||
subprocess.run(cmd, check=False)
|
subprocess.run(cmd, check=False)
|
||||||
sleep(5)
|
sleep(5)
|
||||||
|
|
||||||
# Check status
|
# Check status
|
||||||
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(
|
||||||
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
|
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
act_str = act_str.stdout.decode()
|
act_str = act_str.stdout.decode()
|
||||||
act_str = act_str.splitlines()
|
act_str = act_str.splitlines()
|
||||||
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(
|
||||||
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
|
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
activation_string = activation_string.stdout.decode()
|
activation_string = activation_string.stdout.decode()
|
||||||
|
|
||||||
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.")
|
||||||
|
|
|
||||||
|
|
@ -1,446 +1,446 @@
|
||||||
# Wizard Kit: Functions - Browsers
|
# Wizard Kit: Functions - Browsers
|
||||||
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
|
|
||||||
# Define other_results for later try_and_print
|
# Define other_results for later try_and_print
|
||||||
browser_data = {}
|
browser_data = {}
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
'MultipleInstallationsError': 'Multiple installations detected',
|
'MultipleInstallationsError': 'Multiple installations detected',
|
||||||
},
|
},
|
||||||
'Warning': {
|
'Warning': {
|
||||||
'NotInstalledError': 'Not installed',
|
'NotInstalledError': 'Not installed',
|
||||||
'NoProfilesError': 'No profiles found',
|
'NoProfilesError': 'No profiles found',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Regex
|
# Regex
|
||||||
REGEX_BACKUP = re.compile(
|
REGEX_BACKUP = re.compile(
|
||||||
r'\.\w*bak.*',
|
r'\.\w*bak.*',
|
||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
REGEX_CHROMIUM_PROFILE = re.compile(
|
REGEX_CHROMIUM_PROFILE = re.compile(
|
||||||
r'^(Default|Profile)',
|
r'^(Default|Profile)',
|
||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
REGEX_CHROMIUM_ITEMS = re.compile(
|
REGEX_CHROMIUM_ITEMS = re.compile(
|
||||||
r'^(Bookmarks|Cookies|Favicons|Google Profile'
|
r'^(Bookmarks|Cookies|Favicons|Google Profile'
|
||||||
r'|History|Login Data|Top Sites|TransportSecurity'
|
r'|History|Login Data|Top Sites|TransportSecurity'
|
||||||
r'|Visited Links|Web Data)',
|
r'|Visited Links|Web Data)',
|
||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
REGEX_MOZILLA = re.compile(
|
REGEX_MOZILLA = re.compile(
|
||||||
r'^(bookmarkbackups|(cookies|formhistory|places).sqlite'
|
r'^(bookmarkbackups|(cookies|formhistory|places).sqlite'
|
||||||
r'|key3.db|logins.json|persdict.dat)$',
|
r'|key3.db|logins.json|persdict.dat)$',
|
||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
|
|
||||||
# STATIC VARIABLES
|
# STATIC VARIABLES
|
||||||
DEFAULT_HOMEPAGE = 'https://www.google.com/'
|
DEFAULT_HOMEPAGE = 'https://www.google.com/'
|
||||||
IE_GALLERY = 'https://www.microsoft.com/en-us/iegallery'
|
IE_GALLERY = 'https://www.microsoft.com/en-us/iegallery'
|
||||||
MOZILLA_PREFS = {
|
MOZILLA_PREFS = {
|
||||||
'browser.search.defaultenginename': '"Google"',
|
'browser.search.defaultenginename': '"Google"',
|
||||||
'browser.search.defaultenginename.US': '"Google"',
|
'browser.search.defaultenginename.US': '"Google"',
|
||||||
'browser.search.geoSpecificDefaults': 'false',
|
'browser.search.geoSpecificDefaults': 'false',
|
||||||
'browser.startup.homepage': '"{}"'.format(DEFAULT_HOMEPAGE),
|
'browser.startup.homepage': '"{}"'.format(DEFAULT_HOMEPAGE),
|
||||||
'extensions.ui.lastCategory': '"addons://list/extension"',
|
'extensions.ui.lastCategory': '"addons://list/extension"',
|
||||||
}
|
}
|
||||||
UBO_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en'
|
UBO_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en'
|
||||||
UBO_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm'
|
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 = 'https://chrome.google.com/webstore/detail/ublock-origin-extra/pgdnlhfefecpicbbihgmbmffkjpaplco?hl=en'
|
||||||
UBO_EXTRA_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco'
|
UBO_EXTRA_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco'
|
||||||
UBO_MOZILLA = 'https://addons.mozilla.org/en-us/firefox/addon/ublock-origin/'
|
UBO_MOZILLA = 'https://addons.mozilla.org/en-us/firefox/addon/ublock-origin/'
|
||||||
UBO_OPERA = 'https://addons.opera.com/en/extensions/details/ublock/?display=en'
|
UBO_OPERA = 'https://addons.opera.com/en/extensions/details/ublock/?display=en'
|
||||||
SUPPORTED_BROWSERS = {
|
SUPPORTED_BROWSERS = {
|
||||||
'Internet Explorer': {
|
'Internet Explorer': {
|
||||||
'base': 'ie',
|
'base': 'ie',
|
||||||
'exe_name': 'iexplore.exe',
|
'exe_name': 'iexplore.exe',
|
||||||
'rel_install_path': 'Internet Explorer',
|
'rel_install_path': 'Internet Explorer',
|
||||||
'user_data_path': r'{USERPROFILE}\Favorites',
|
'user_data_path': r'{USERPROFILE}\Favorites',
|
||||||
},
|
},
|
||||||
'Google Chrome': {
|
'Google Chrome': {
|
||||||
'base': 'chromium',
|
'base': 'chromium',
|
||||||
'exe_name': 'chrome.exe',
|
'exe_name': 'chrome.exe',
|
||||||
'rel_install_path': r'Google\Chrome\Application',
|
'rel_install_path': r'Google\Chrome\Application',
|
||||||
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome\User Data',
|
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome\User Data',
|
||||||
},
|
},
|
||||||
'Google Chrome Canary': {
|
'Google Chrome Canary': {
|
||||||
'base': 'chromium',
|
'base': 'chromium',
|
||||||
'exe_name': 'chrome.exe',
|
'exe_name': 'chrome.exe',
|
||||||
'rel_install_path': r'Google\Chrome SxS\Application',
|
'rel_install_path': r'Google\Chrome SxS\Application',
|
||||||
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome SxS\User Data',
|
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome SxS\User Data',
|
||||||
},
|
},
|
||||||
'Mozilla Firefox': {
|
'Mozilla Firefox': {
|
||||||
'base': 'mozilla',
|
'base': 'mozilla',
|
||||||
'exe_name': 'firefox.exe',
|
'exe_name': 'firefox.exe',
|
||||||
'rel_install_path': 'Mozilla Firefox',
|
'rel_install_path': 'Mozilla Firefox',
|
||||||
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
|
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
|
||||||
},
|
},
|
||||||
'Mozilla Firefox Dev': {
|
'Mozilla Firefox Dev': {
|
||||||
'base': 'mozilla',
|
'base': 'mozilla',
|
||||||
'exe_name': 'firefox.exe',
|
'exe_name': 'firefox.exe',
|
||||||
'rel_install_path': 'Firefox Developer Edition',
|
'rel_install_path': 'Firefox Developer Edition',
|
||||||
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
|
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
|
||||||
},
|
},
|
||||||
'Opera': {
|
'Opera': {
|
||||||
'base': 'chromium',
|
'base': 'chromium',
|
||||||
'exe_name': 'launcher.exe',
|
'exe_name': 'launcher.exe',
|
||||||
'rel_install_path': 'Opera',
|
'rel_install_path': 'Opera',
|
||||||
'user_data_path': r'{APPDATA}\Opera Software\Opera Stable',
|
'user_data_path': r'{APPDATA}\Opera Software\Opera Stable',
|
||||||
},
|
},
|
||||||
'Opera Beta': {
|
'Opera Beta': {
|
||||||
'base': 'chromium',
|
'base': 'chromium',
|
||||||
'exe_name': 'launcher.exe',
|
'exe_name': 'launcher.exe',
|
||||||
'rel_install_path': 'Opera beta',
|
'rel_install_path': 'Opera beta',
|
||||||
'user_data_path': r'{APPDATA}\Opera Software\Opera Next',
|
'user_data_path': r'{APPDATA}\Opera Software\Opera Next',
|
||||||
},
|
},
|
||||||
'Opera Dev': {
|
'Opera Dev': {
|
||||||
'base': 'chromium',
|
'base': 'chromium',
|
||||||
'exe_name': 'launcher.exe',
|
'exe_name': 'launcher.exe',
|
||||||
'rel_install_path': 'Opera developer',
|
'rel_install_path': 'Opera developer',
|
||||||
'user_data_path': r'{APPDATA}\Opera Software\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})'.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',
|
||||||
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."""
|
"""Renames profile, creates a new folder, and copies the user data to it."""
|
||||||
if profile is None:
|
if profile is None:
|
||||||
raise Exception
|
raise Exception
|
||||||
backup_path = '{path}_{Date}.bak'.format(
|
backup_path = '{path}_{Date}.bak'.format(
|
||||||
path=profile['path'], **global_vars)
|
path=profile['path'], **global_vars)
|
||||||
backup_path = non_clobber_rename(backup_path)
|
backup_path = non_clobber_rename(backup_path)
|
||||||
shutil.move(profile['path'], backup_path)
|
shutil.move(profile['path'], backup_path)
|
||||||
os.makedirs(profile['path'], exist_ok=True)
|
os.makedirs(profile['path'], exist_ok=True)
|
||||||
|
|
||||||
# Restore essential files from backup_path
|
# Restore essential files from backup_path
|
||||||
for entry in os.scandir(backup_path):
|
for entry in os.scandir(backup_path):
|
||||||
if REGEX_CHROMIUM_ITEMS.search(entry.name):
|
if REGEX_CHROMIUM_ITEMS.search(entry.name):
|
||||||
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.
|
||||||
|
|
||||||
NOTE: kwargs set but unused as a workaround."""
|
NOTE: kwargs set but unused as a workaround."""
|
||||||
kill_process('iexplore.exe')
|
kill_process('iexplore.exe')
|
||||||
run_program(['rundll32.exe', 'inetcpl.cpl,ResetIEtoDefaults'], check=False)
|
run_program(['rundll32.exe', 'inetcpl.cpl,ResetIEtoDefaults'], check=False)
|
||||||
key = r'Software\Microsoft\Internet Explorer\Main'
|
key = r'Software\Microsoft\Internet Explorer\Main'
|
||||||
|
|
||||||
# Set homepage
|
# Set homepage
|
||||||
with winreg.OpenKey(HKCU, key, access=winreg.KEY_WRITE) as _key:
|
with winreg.OpenKey(HKCU, key, access=winreg.KEY_WRITE) as _key:
|
||||||
winreg.SetValueEx(_key, 'Start Page', 0,
|
winreg.SetValueEx(_key, 'Start Page', 0,
|
||||||
winreg.REG_SZ, DEFAULT_HOMEPAGE)
|
winreg.REG_SZ, DEFAULT_HOMEPAGE)
|
||||||
try:
|
try:
|
||||||
winreg.DeleteValue(_key, 'Secondary Start Pages')
|
winreg.DeleteValue(_key, 'Secondary Start Pages')
|
||||||
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."""
|
"""Renames profile, creates a new folder, and copies the user data to it."""
|
||||||
if profile is None:
|
if profile is None:
|
||||||
raise Exception
|
raise Exception
|
||||||
backup_path = '{path}_{Date}.bak'.format(
|
backup_path = '{path}_{Date}.bak'.format(
|
||||||
path=profile['path'], **global_vars)
|
path=profile['path'], **global_vars)
|
||||||
backup_path = non_clobber_rename(backup_path)
|
backup_path = non_clobber_rename(backup_path)
|
||||||
shutil.move(profile['path'], backup_path)
|
shutil.move(profile['path'], backup_path)
|
||||||
homepages = []
|
homepages = []
|
||||||
os.makedirs(profile['path'], exist_ok=True)
|
os.makedirs(profile['path'], exist_ok=True)
|
||||||
|
|
||||||
# Restore essential files from backup_path
|
# Restore essential files from backup_path
|
||||||
for entry in os.scandir(backup_path):
|
for entry in os.scandir(backup_path):
|
||||||
if REGEX_MOZILLA.search(entry.name):
|
if REGEX_MOZILLA.search(entry.name):
|
||||||
if entry.is_dir():
|
if entry.is_dir():
|
||||||
shutil.copytree(entry.path, r'{}\{}'.format(
|
shutil.copytree(entry.path, r'{}\{}'.format(
|
||||||
profile['path'], entry.name))
|
profile['path'], entry.name))
|
||||||
else:
|
else:
|
||||||
shutil.copy(entry.path, r'{}\{}'.format(
|
shutil.copy(entry.path, r'{}\{}'.format(
|
||||||
profile['path'], entry.name))
|
profile['path'], entry.name))
|
||||||
|
|
||||||
# Set profile defaults
|
# Set profile defaults
|
||||||
with open(r'{path}\prefs.js'.format(**profile), 'a', encoding='ascii') as f:
|
with open(r'{path}\prefs.js'.format(**profile), 'a', encoding='ascii') as f:
|
||||||
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 status 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
|
||||||
browser['user_data_path'] = browser['user_data_path'].format(
|
browser['user_data_path'] = browser['user_data_path'].format(
|
||||||
**global_vars['Env'])
|
**global_vars['Env'])
|
||||||
|
|
||||||
# Find executable (if multiple files are found, the last one is used)
|
# Find executable (if multiple files are found, the last one is used)
|
||||||
exe_path = None
|
exe_path = None
|
||||||
num_installs = 0
|
num_installs = 0
|
||||||
for install_path in ['LOCALAPPDATA', 'PROGRAMFILES(X86)', 'PROGRAMFILES']:
|
for install_path in ['LOCALAPPDATA', 'PROGRAMFILES(X86)', 'PROGRAMFILES']:
|
||||||
test_path = r'{install_path}\{rel_install_path}\{exe_name}'.format(
|
test_path = r'{install_path}\{rel_install_path}\{exe_name}'.format(
|
||||||
install_path = global_vars['Env'].get(install_path, ''),
|
install_path = global_vars['Env'].get(install_path, ''),
|
||||||
**browser)
|
**browser)
|
||||||
if os.path.exists(test_path):
|
if os.path.exists(test_path):
|
||||||
num_installs += 1
|
num_installs += 1
|
||||||
exe_path = test_path
|
exe_path = test_path
|
||||||
|
|
||||||
# Find profile(s)
|
# Find profile(s)
|
||||||
profiles = []
|
profiles = []
|
||||||
if browser['base'] == 'ie':
|
if browser['base'] == 'ie':
|
||||||
profiles.append({'name': 'Default', 'path': None})
|
profiles.append({'name': 'Default', 'path': None})
|
||||||
elif 'Google Chrome' in name:
|
elif 'Google Chrome' in name:
|
||||||
profiles.extend(
|
profiles.extend(
|
||||||
get_chromium_profiles(
|
get_chromium_profiles(
|
||||||
search_path=browser['user_data_path']))
|
search_path=browser['user_data_path']))
|
||||||
elif browser['base'] == 'mozilla':
|
elif browser['base'] == 'mozilla':
|
||||||
dev = 'Dev' in name
|
dev = 'Dev' in name
|
||||||
profiles.extend(
|
profiles.extend(
|
||||||
get_mozilla_profiles(
|
get_mozilla_profiles(
|
||||||
search_path=browser['user_data_path'], dev=dev))
|
search_path=browser['user_data_path'], dev=dev))
|
||||||
if exe_path and not dev and len(profiles) == 0:
|
if exe_path and not dev and len(profiles) == 0:
|
||||||
# e.g. If Firefox is installed but no profiles were found.
|
# e.g. If Firefox is installed but no profiles were found.
|
||||||
## Rename profiles.ini and create a new default profile
|
## Rename profiles.ini and create a new default profile
|
||||||
profiles_ini_path = browser['user_data_path'].replace(
|
profiles_ini_path = browser['user_data_path'].replace(
|
||||||
'Profiles', 'profiles.ini')
|
'Profiles', 'profiles.ini')
|
||||||
if os.path.exists(profiles_ini_path):
|
if os.path.exists(profiles_ini_path):
|
||||||
backup_path = '{path}_{Date}.bak'.format(
|
backup_path = '{path}_{Date}.bak'.format(
|
||||||
path=profiles_ini_path, **global_vars)
|
path=profiles_ini_path, **global_vars)
|
||||||
backup_path = non_clobber_rename(backup_path)
|
backup_path = non_clobber_rename(backup_path)
|
||||||
shutil.move(profiles_ini_path, backup_path)
|
shutil.move(profiles_ini_path, backup_path)
|
||||||
run_program([exe_path, '-createprofile', 'default'], check=False)
|
run_program([exe_path, '-createprofile', 'default'], check=False)
|
||||||
profiles.extend(
|
profiles.extend(
|
||||||
get_mozilla_profiles(
|
get_mozilla_profiles(
|
||||||
search_path=browser['user_data_path'], dev=dev))
|
search_path=browser['user_data_path'], dev=dev))
|
||||||
|
|
||||||
elif 'Opera' in name:
|
elif 'Opera' in name:
|
||||||
if os.path.exists(browser['user_data_path']):
|
if os.path.exists(browser['user_data_path']):
|
||||||
profiles.append(
|
profiles.append(
|
||||||
{'name': 'Default', 'path': browser['user_data_path']})
|
{'name': 'Default', 'path': browser['user_data_path']})
|
||||||
|
|
||||||
# Get homepages
|
# Get homepages
|
||||||
if browser['base'] == 'ie':
|
if browser['base'] == 'ie':
|
||||||
# IE is set to only have one profile above
|
# IE is set to only have one profile above
|
||||||
profiles[0]['homepages'] = get_ie_homepages()
|
profiles[0]['homepages'] = get_ie_homepages()
|
||||||
elif browser['base'] == 'mozilla':
|
elif browser['base'] == 'mozilla':
|
||||||
for profile in profiles:
|
for profile in profiles:
|
||||||
prefs_path = r'{path}\prefs.js'.format(**profile)
|
prefs_path = r'{path}\prefs.js'.format(**profile)
|
||||||
profile['homepages'] = get_mozilla_homepages(prefs_path=prefs_path)
|
profile['homepages'] = get_mozilla_homepages(prefs_path=prefs_path)
|
||||||
|
|
||||||
# Add to browser_data
|
# Add to browser_data
|
||||||
browser_data[name] = browser
|
browser_data[name] = browser
|
||||||
browser_data[name].update({
|
browser_data[name].update({
|
||||||
'exe_path': exe_path,
|
'exe_path': exe_path,
|
||||||
'profiles': profiles,
|
'profiles': profiles,
|
||||||
})
|
})
|
||||||
|
|
||||||
# Raise installation warnings (if any)
|
# Raise installation warnings (if any)
|
||||||
if num_installs == 0:
|
if num_installs == 0:
|
||||||
raise NotInstalledError
|
raise NotInstalledError
|
||||||
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 = []
|
||||||
try:
|
try:
|
||||||
for entry in os.scandir(search_path):
|
for entry in os.scandir(search_path):
|
||||||
if entry.is_dir() and REGEX_CHROMIUM_PROFILE.search(entry.name):
|
if entry.is_dir() and REGEX_CHROMIUM_PROFILE.search(entry.name):
|
||||||
profiles.append(entry)
|
profiles.append(entry)
|
||||||
REGEX_PROFILE_BACKUP = r'\.\w+bak.*'
|
REGEX_PROFILE_BACKUP = r'\.\w+bak.*'
|
||||||
profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)]
|
profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)]
|
||||||
# Convert os.DirEntries to dicts
|
# Convert os.DirEntries to dicts
|
||||||
profiles = [{'name': p.name, 'path': p.path} for p in profiles]
|
profiles = [{'name': p.name, 'path': p.path} for p in profiles]
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
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 = []
|
||||||
main_page = ''
|
main_page = ''
|
||||||
extra_pages = []
|
extra_pages = []
|
||||||
key = r'Software\Microsoft\Internet Explorer\Main'
|
key = r'Software\Microsoft\Internet Explorer\Main'
|
||||||
with winreg.OpenKey(HKCU, key) as _key:
|
with winreg.OpenKey(HKCU, key) as _key:
|
||||||
try:
|
try:
|
||||||
main_page = winreg.QueryValueEx(_key, 'Start Page')[0]
|
main_page = winreg.QueryValueEx(_key, 'Start Page')[0]
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
extra_pages = winreg.QueryValueEx(_key, 'Secondary Start Pages')[0]
|
extra_pages = winreg.QueryValueEx(_key, 'Secondary Start Pages')[0]
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
pass
|
pass
|
||||||
if main_page != '':
|
if main_page != '':
|
||||||
homepages.append(main_page)
|
homepages.append(main_page)
|
||||||
if len(extra_pages) > 0:
|
if len(extra_pages) > 0:
|
||||||
homepages.extend(extra_pages)
|
homepages.extend(extra_pages)
|
||||||
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 = []
|
||||||
try:
|
try:
|
||||||
with open(prefs_path, 'r') as f:
|
with open(prefs_path, 'r') as f:
|
||||||
search = re.search(
|
search = re.search(
|
||||||
r'browser\.startup\.homepage", "([^"]*)"',
|
r'browser\.startup\.homepage", "([^"]*)"',
|
||||||
f.read(), re.IGNORECASE)
|
f.read(), re.IGNORECASE)
|
||||||
if search:
|
if search:
|
||||||
homepages = search.group(1).split('|')
|
homepages = search.group(1).split('|')
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
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 = []
|
||||||
try:
|
try:
|
||||||
for entry in os.scandir(search_path):
|
for entry in os.scandir(search_path):
|
||||||
if entry.is_dir():
|
if entry.is_dir():
|
||||||
if 'dev-edition' in entry.name:
|
if 'dev-edition' in entry.name:
|
||||||
# NOTE: Not always present which can lead
|
# NOTE: Not always present which can lead
|
||||||
# to Dev profiles being marked as non-Dev
|
# to Dev profiles being marked as non-Dev
|
||||||
## NOTE 2: It is possible that a non-Dev profile
|
## NOTE 2: It is possible that a non-Dev profile
|
||||||
## to be created with 'dev-edition' in the name.
|
## to be created with 'dev-edition' in the name.
|
||||||
## (It wouldn't make sense, but possible)
|
## (It wouldn't make sense, but possible)
|
||||||
if dev:
|
if dev:
|
||||||
profiles.append(entry)
|
profiles.append(entry)
|
||||||
elif not dev:
|
elif not dev:
|
||||||
profiles.append(entry)
|
profiles.append(entry)
|
||||||
profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)]
|
profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)]
|
||||||
# Convert os.DirEntries to dicts
|
# Convert os.DirEntries to dicts
|
||||||
profiles = [{'name': p.name, 'path': p.path} for p in profiles]
|
profiles = [{'name': p.name, 'path': p.path} for p in profiles]
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return profiles
|
return profiles
|
||||||
|
|
||||||
def install_adblock(indent=8, width=32):
|
def install_adblock(indent=8, width=32):
|
||||||
"""Install adblock for all supported browsers."""
|
"""Install adblock for all supported browsers."""
|
||||||
for browser in sorted(browser_data):
|
for browser in sorted(browser_data):
|
||||||
exe_path = browser_data[browser].get('exe_path', None)
|
exe_path = browser_data[browser].get('exe_path', None)
|
||||||
function=run_program
|
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(
|
||||||
'{indent}{browser:<{width}}'.format(
|
'{indent}{browser:<{width}}'.format(
|
||||||
indent=' '*indent, width=width, browser=browser+'...'),
|
indent=' '*indent, width=width, browser=browser+'...'),
|
||||||
end='', flush=True)
|
end='', flush=True)
|
||||||
print_warning('Profile(s) detected but browser not installed',
|
print_warning('Profile(s) detected but browser not installed',
|
||||||
timestamp=False)
|
timestamp=False)
|
||||||
else:
|
else:
|
||||||
# Only warn if profile(s) are detected.
|
# Only warn if profile(s) are detected.
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
# Set urls to open
|
# Set urls to open
|
||||||
urls = []
|
urls = []
|
||||||
if browser_data[browser]['base'] == 'chromium':
|
if browser_data[browser]['base'] == 'chromium':
|
||||||
if browser == 'Google Chrome':
|
if browser == 'Google Chrome':
|
||||||
# Check for system exensions
|
# Check for system exensions
|
||||||
try:
|
try:
|
||||||
winreg.QueryValue(HKLM, UBO_CHROME_REG)
|
winreg.QueryValue(HKLM, UBO_CHROME_REG)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
urls.append(UBO_CHROME)
|
urls.append(UBO_CHROME)
|
||||||
try:
|
try:
|
||||||
winreg.QueryValue(HKLM, UBO_EXTRA_CHROME_REG)
|
winreg.QueryValue(HKLM, UBO_EXTRA_CHROME_REG)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
urls.append(UBO_EXTRA_CHROME)
|
urls.append(UBO_EXTRA_CHROME)
|
||||||
|
|
||||||
if len(urls) == 0:
|
if len(urls) == 0:
|
||||||
urls = ['chrome://extensions']
|
urls = ['chrome://extensions']
|
||||||
elif 'Opera' in browser:
|
elif 'Opera' in browser:
|
||||||
urls.append(UBO_OPERA)
|
urls.append(UBO_OPERA)
|
||||||
else:
|
else:
|
||||||
urls.append(UBO_CHROME)
|
urls.append(UBO_CHROME)
|
||||||
urls.append(UBO_EXTRA_CHROME)
|
urls.append(UBO_EXTRA_CHROME)
|
||||||
|
|
||||||
elif browser_data[browser]['base'] == 'mozilla':
|
elif browser_data[browser]['base'] == 'mozilla':
|
||||||
# Assume UBO is not installed first and change if it is
|
# Assume UBO is not installed first and change if it is
|
||||||
urls.append(UBO_MOZILLA)
|
urls.append(UBO_MOZILLA)
|
||||||
if browser == 'Mozilla Firefox':
|
if browser == 'Mozilla Firefox':
|
||||||
ubo = browser_data[browser]['exe_path'].replace(
|
ubo = browser_data[browser]['exe_path'].replace(
|
||||||
'firefox.exe',
|
'firefox.exe',
|
||||||
r'distribution\extensions\uBlock0@raymondhill.net')
|
r'distribution\extensions\uBlock0@raymondhill.net')
|
||||||
if os.path.exists(ubo):
|
if os.path.exists(ubo):
|
||||||
urls = ['about:addons']
|
urls = ['about:addons']
|
||||||
|
|
||||||
elif browser_data[browser]['base'] == 'ie':
|
elif browser_data[browser]['base'] == 'ie':
|
||||||
urls.append(IE_GALLERY)
|
urls.append(IE_GALLERY)
|
||||||
function=popen_program
|
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
|
||||||
# (or can't be found).
|
# (or can't be found).
|
||||||
# In other words, this isn't tracking the addon/extension's
|
# In other words, this isn't tracking the addon/extension's
|
||||||
# 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='Done', function=function,
|
||||||
cmd=[exe_path, *urls], check=False)
|
cmd=[exe_path, *urls], check=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."""
|
||||||
|
|
||||||
for browser in [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']]:
|
||||||
# Skip Chromium-based browsers
|
# Skip Chromium-based browsers
|
||||||
if browser_data[browser]['base'] == 'chromium':
|
if browser_data[browser]['base'] == 'chromium':
|
||||||
print_info(
|
print_info(
|
||||||
'{indent}{browser:<{width}}'.format(
|
'{indent}{browser:<{width}}'.format(
|
||||||
indent=' '*indent, width=width, browser=browser+'...'),
|
indent=' '*indent, width=width, browser=browser+'...'),
|
||||||
end='', flush=True)
|
end='', flush=True)
|
||||||
print_warning('Not implemented', timestamp=False)
|
print_warning('Not implemented', timestamp=False)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# All other browsers
|
# All other browsers
|
||||||
print_info('{indent}{browser:<{width}}'.format(
|
print_info('{indent}{browser:<{width}}'.format(
|
||||||
indent=' '*indent, width=width, browser=browser+'...'))
|
indent=' '*indent, width=width, browser=browser+'...'))
|
||||||
for profile in browser_data[browser].get('profiles', []):
|
for profile in browser_data[browser].get('profiles', []):
|
||||||
name = profile.get('name', '?')
|
name = profile.get('name', '?')
|
||||||
homepages = profile.get('homepages', [])
|
homepages = profile.get('homepages', [])
|
||||||
if len(homepages) == 0:
|
if len(homepages) == 0:
|
||||||
print_standard(
|
print_standard(
|
||||||
'{indent}{name:<{width}}'.format(
|
'{indent}{name:<{width}}'.format(
|
||||||
indent=' '*indent, width=width, name=name),
|
indent=' '*indent, width=width, name=name),
|
||||||
end='', flush=True)
|
end='', flush=True)
|
||||||
print_warning('None found', timestamp=False)
|
print_warning('None found', timestamp=False)
|
||||||
else:
|
else:
|
||||||
for page in homepages:
|
for page in homepages:
|
||||||
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 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']]:
|
for browser in [k for k, v in sorted(browser_data.items()) if v['profiles']]:
|
||||||
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':
|
||||||
function = clean_chromium_profile
|
function = clean_chromium_profile
|
||||||
elif browser_data[browser]['base'] == 'ie':
|
elif browser_data[browser]['base'] == 'ie':
|
||||||
function = clean_internet_explorer
|
function = clean_internet_explorer
|
||||||
elif browser_data[browser]['base'] == 'mozilla':
|
elif browser_data[browser]['base'] == 'mozilla':
|
||||||
function = clean_mozilla_profile
|
function = clean_mozilla_profile
|
||||||
try_and_print(
|
try_and_print(
|
||||||
message='{}...'.format(profile['name']),
|
message='{}...'.format(profile['name']),
|
||||||
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():
|
||||||
"""Scan system for any supported browsers."""
|
"""Scan system for any supported browsers."""
|
||||||
for name in sorted(SUPPORTED_BROWSERS):
|
for name in sorted(SUPPORTED_BROWSERS):
|
||||||
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.")
|
||||||
|
|
|
||||||
|
|
@ -1,91 +1,91 @@
|
||||||
# Wizard Kit: Functions - Cleanup
|
# Wizard Kit: Functions - Cleanup
|
||||||
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
|
|
||||||
def cleanup_adwcleaner():
|
def cleanup_adwcleaner():
|
||||||
"""Move AdwCleaner folders into the ClientDir."""
|
"""Move AdwCleaner folders into the ClientDir."""
|
||||||
source_path = r'{SYSTEMDRIVE}\AdwCleaner'.format(**global_vars['Env'])
|
source_path = r'{SYSTEMDRIVE}\AdwCleaner'.format(**global_vars['Env'])
|
||||||
source_quarantine = r'{}\Quarantine'.format(source_path)
|
source_quarantine = r'{}\Quarantine'.format(source_path)
|
||||||
|
|
||||||
# Quarantine
|
# Quarantine
|
||||||
if os.path.exists(source_quarantine):
|
if os.path.exists(source_quarantine):
|
||||||
os.makedirs(global_vars['QuarantineDir'], exist_ok=True)
|
os.makedirs(global_vars['QuarantineDir'], exist_ok=True)
|
||||||
dest_name = r'{QuarantineDir}\AdwCleaner_{Date-Time}'.format(
|
dest_name = r'{QuarantineDir}\AdwCleaner_{Date-Time}'.format(
|
||||||
**global_vars)
|
**global_vars)
|
||||||
dest_name = non_clobber_rename(dest_name)
|
dest_name = non_clobber_rename(dest_name)
|
||||||
shutil.move(source_quarantine, dest_name)
|
shutil.move(source_quarantine, dest_name)
|
||||||
|
|
||||||
# Delete source folder if empty
|
# Delete source folder if empty
|
||||||
try:
|
try:
|
||||||
os.rmdir(source_path)
|
os.rmdir(source_path)
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
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['ProgBackupDir'], exist_ok=True)
|
||||||
dest_name = r'{ProgBackupDir}\AdwCleaner_{Date-Time}'.format(
|
dest_name = r'{ProgBackupDir}\AdwCleaner_{Date-Time}'.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.
|
||||||
|
|
||||||
If a CbsPersist file is larger than 2 Gb then the auto archive feature
|
If a CbsPersist file is larger than 2 Gb then the auto archive feature
|
||||||
continually fails and will fill up the system drive with temp files.
|
continually fails and will fill up the system drive with temp files.
|
||||||
|
|
||||||
This function moves the temp files and CbsPersist file to a temp folder,
|
This function moves the temp files and CbsPersist file to a temp folder,
|
||||||
compresses the CbsPersist files with 7-Zip, and then opens the temp folder
|
compresses the CbsPersist files with 7-Zip, and then opens the temp folder
|
||||||
for the user to manually save the backup files and delete the temp files.
|
for the user to manually save the backup files and delete the temp files.
|
||||||
"""
|
"""
|
||||||
backup_folder = r'{dest_folder}\CbsFix'.format(dest_folder=dest_folder)
|
backup_folder = r'{dest_folder}\CbsFix'.format(dest_folder=dest_folder)
|
||||||
temp_folder = r'{backup_folder}\Temp'.format(backup_folder=backup_folder)
|
temp_folder = r'{backup_folder}\Temp'.format(backup_folder=backup_folder)
|
||||||
os.makedirs(backup_folder, exist_ok=True)
|
os.makedirs(backup_folder, exist_ok=True)
|
||||||
os.makedirs(temp_folder, exist_ok=True)
|
os.makedirs(temp_folder, exist_ok=True)
|
||||||
|
|
||||||
# Move files into temp folder
|
# Move files into temp folder
|
||||||
cbs_path = r'{SYSTEMROOT}\Logs\CBS'.format(**global_vars['Env'])
|
cbs_path = r'{SYSTEMROOT}\Logs\CBS'.format(**global_vars['Env'])
|
||||||
for entry in os.scandir(cbs_path):
|
for entry in os.scandir(cbs_path):
|
||||||
# CbsPersist files
|
# CbsPersist files
|
||||||
if entry.name.lower().startswith('cbspersist'):
|
if entry.name.lower().startswith('cbspersist'):
|
||||||
dest_name = r'{}\{}'.format(temp_folder, entry.name)
|
dest_name = r'{}\{}'.format(temp_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)
|
||||||
temp_path = r'{SYSTEMROOT}\Temp'.format(**global_vars['Env'])
|
temp_path = r'{SYSTEMROOT}\Temp'.format(**global_vars['Env'])
|
||||||
for entry in os.scandir(temp_path):
|
for entry in os.scandir(temp_path):
|
||||||
# cab_ files
|
# cab_ files
|
||||||
if entry.name.lower().startswith('cab_'):
|
if entry.name.lower().startswith('cab_'):
|
||||||
dest_name = r'{}\{}'.format(temp_folder, entry.name)
|
dest_name = r'{}\{}'.format(temp_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)
|
||||||
|
|
||||||
# Compress CbsPersist files with 7-Zip
|
# Compress CbsPersist files with 7-Zip
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['SevenZip'],
|
global_vars['Tools']['SevenZip'],
|
||||||
'a', '-t7z', '-mx=3', '-bso0', '-bse0',
|
'a', '-t7z', '-mx=3', '-bso0', '-bse0',
|
||||||
r'{}\CbsPersists.7z'.format(backup_folder),
|
r'{}\CbsPersists.7z'.format(backup_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'{ProgBackupDir}\Desktop_{Date-Time}'.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
|
# JRT, RKill, Shortcut cleaner
|
||||||
if re.search(r'^(JRT|RKill|sc-cleaner)', entry.name, re.IGNORECASE):
|
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
|
||||||
try:
|
try:
|
||||||
os.rmdir(dest_folder)
|
os.rmdir(dest_folder)
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
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.")
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,114 +1,114 @@
|
||||||
# Wizard Kit: Functions - Diagnostics
|
# Wizard Kit: Functions - Diagnostics
|
||||||
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
|
|
||||||
# STATIC VARIABLES
|
# STATIC VARIABLES
|
||||||
AUTORUNS_SETTINGS = {
|
AUTORUNS_SETTINGS = {
|
||||||
r'Software\Sysinternals\AutoRuns': {
|
r'Software\Sysinternals\AutoRuns': {
|
||||||
'checkvirustotal': 1,
|
'checkvirustotal': 1,
|
||||||
'EulaAccepted': 1,
|
'EulaAccepted': 1,
|
||||||
'shownomicrosoft': 1,
|
'shownomicrosoft': 1,
|
||||||
'shownowindows': 1,
|
'shownowindows': 1,
|
||||||
'showonlyvirustotal': 1,
|
'showonlyvirustotal': 1,
|
||||||
'submitvirustotal': 0,
|
'submitvirustotal': 0,
|
||||||
'verifysignatures': 1,
|
'verifysignatures': 1,
|
||||||
},
|
},
|
||||||
r'Software\Sysinternals\AutoRuns\SigCheck': {
|
r'Software\Sysinternals\AutoRuns\SigCheck': {
|
||||||
'EulaAccepted': 1,
|
'EulaAccepted': 1,
|
||||||
},
|
},
|
||||||
r'Software\Sysinternals\AutoRuns\Streams': {
|
r'Software\Sysinternals\AutoRuns\Streams': {
|
||||||
'EulaAccepted': 1,
|
'EulaAccepted': 1,
|
||||||
},
|
},
|
||||||
r'Software\Sysinternals\AutoRuns\VirusTotal': {
|
r'Software\Sysinternals\AutoRuns\VirusTotal': {
|
||||||
'VirusTotalTermsAccepted': 1,
|
'VirusTotalTermsAccepted': 1,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def check_connection():
|
def check_connection():
|
||||||
"""Check if the system is online and optionally abort the script."""
|
"""Check if the system is online and optionally abort the script."""
|
||||||
while True:
|
while True:
|
||||||
result = try_and_print(message='Ping test...', function=ping, cs='OK')
|
result = try_and_print(message='Ping test...', function=ping, cs='OK')
|
||||||
if result['CS']:
|
if result['CS']:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
if not ask('ERROR: System appears offline, try again?'):
|
if not ask('ERROR: System appears offline, try again?'):
|
||||||
if ask('Continue anyway?'):
|
if ask('Continue anyway?'):
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
abort()
|
abort()
|
||||||
|
|
||||||
def run_autoruns():
|
def run_autoruns():
|
||||||
"""Run AutoRuns in the background with VirusTotal checks enabled."""
|
"""Run AutoRuns in the background with VirusTotal checks enabled."""
|
||||||
extract_item('Autoruns', filter='autoruns*', silent=True)
|
extract_item('Autoruns', filter='autoruns*', silent=True)
|
||||||
# Update AutoRuns settings before running
|
# Update AutoRuns settings before running
|
||||||
for path, settings in AUTORUNS_SETTINGS.items():
|
for path, settings in AUTORUNS_SETTINGS.items():
|
||||||
winreg.CreateKey(HKCU, path)
|
winreg.CreateKey(HKCU, path)
|
||||||
with winreg.OpenKey(HKCU, path, access=winreg.KEY_WRITE) as key:
|
with winreg.OpenKey(HKCU, path, access=winreg.KEY_WRITE) as key:
|
||||||
for name, value in settings.items():
|
for name, value in settings.items():
|
||||||
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
|
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
|
||||||
popen_program(global_vars['Tools']['AutoRuns'], minimized=True)
|
popen_program(global_vars['Tools']['AutoRuns'], minimized=True)
|
||||||
|
|
||||||
def run_hwinfo_sensors():
|
def run_hwinfo_sensors():
|
||||||
"""Run HWiNFO sensors."""
|
"""Run HWiNFO sensors."""
|
||||||
path = r'{BinDir}\HWiNFO'.format(**global_vars)
|
path = r'{BinDir}\HWiNFO'.format(**global_vars)
|
||||||
for bit in [32, 64]:
|
for bit in [32, 64]:
|
||||||
# Configure
|
# Configure
|
||||||
source = r'{}\general.ini'.format(path)
|
source = r'{}\general.ini'.format(path)
|
||||||
dest = r'{}\HWiNFO{}.ini'.format(path, bit)
|
dest = r'{}\HWiNFO{}.ini'.format(path, bit)
|
||||||
shutil.copy(source, dest)
|
shutil.copy(source, dest)
|
||||||
with open(dest, 'a') as f:
|
with open(dest, 'a') as f:
|
||||||
f.write('SensorsOnly=1\n')
|
f.write('SensorsOnly=1\n')
|
||||||
f.write('SummaryOnly=0\n')
|
f.write('SummaryOnly=0\n')
|
||||||
popen_program(global_vars['Tools']['HWiNFO'])
|
popen_program(global_vars['Tools']['HWiNFO'])
|
||||||
|
|
||||||
def run_xmplay():
|
def run_xmplay():
|
||||||
"""Run XMPlay to test audio."""
|
"""Run XMPlay to test audio."""
|
||||||
extract_item('XMPlay', silent=True)
|
extract_item('XMPlay', silent=True)
|
||||||
cmd = [global_vars['Tools']['XMPlay'],
|
cmd = [global_vars['Tools']['XMPlay'],
|
||||||
r'{BinDir}\XMPlay\music.7z'.format(**global_vars)]
|
r'{BinDir}\XMPlay\music.7z'.format(**global_vars)]
|
||||||
popen_program(cmd)
|
popen_program(cmd)
|
||||||
|
|
||||||
def run_hitmanpro():
|
def run_hitmanpro():
|
||||||
"""Run HitmanPro in the background."""
|
"""Run HitmanPro in the background."""
|
||||||
extract_item('HitmanPro', silent=True)
|
extract_item('HitmanPro', silent=True)
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['HitmanPro'],
|
global_vars['Tools']['HitmanPro'],
|
||||||
'/quiet', '/noinstall', '/noupload',
|
'/quiet', '/noinstall', '/noupload',
|
||||||
r'/log={LogDir}\hitman.xml'.format(**global_vars)]
|
r'/log={LogDir}\hitman.xml'.format(**global_vars)]
|
||||||
popen_program(cmd)
|
popen_program(cmd)
|
||||||
|
|
||||||
def run_process_killer():
|
def run_process_killer():
|
||||||
"""Kill most running processes skipping those in the whitelist.txt."""
|
"""Kill most running processes skipping those in the whitelist.txt."""
|
||||||
# borrowed from TronScript (reddit.com/r/TronScript)
|
# borrowed from TronScript (reddit.com/r/TronScript)
|
||||||
# credit to /u/cuddlychops06
|
# credit to /u/cuddlychops06
|
||||||
prev_dir = os.getcwd()
|
prev_dir = os.getcwd()
|
||||||
extract_item('ProcessKiller', silent=True)
|
extract_item('ProcessKiller', silent=True)
|
||||||
os.chdir(r'{BinDir}\ProcessKiller'.format(**global_vars))
|
os.chdir(r'{BinDir}\ProcessKiller'.format(**global_vars))
|
||||||
run_program(['ProcessKiller.exe', '/silent'], check=False)
|
run_program(['ProcessKiller.exe', '/silent'], check=False)
|
||||||
os.chdir(prev_dir)
|
os.chdir(prev_dir)
|
||||||
|
|
||||||
def run_rkill():
|
def run_rkill():
|
||||||
"""Run RKill and cleanup afterwards."""
|
"""Run RKill and cleanup afterwards."""
|
||||||
extract_item('RKill', silent=True)
|
extract_item('RKill', silent=True)
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['RKill'],
|
global_vars['Tools']['RKill'],
|
||||||
'-l', r'{LogDir}\RKill.log'.format(**global_vars),
|
'-l', r'{LogDir}\RKill.log'.format(**global_vars),
|
||||||
'-new_console:n', '-new_console:s33V']
|
'-new_console:n', '-new_console:s33V']
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
wait_for_process('RKill')
|
wait_for_process('RKill')
|
||||||
kill_process('notepad.exe')
|
kill_process('notepad.exe')
|
||||||
|
|
||||||
# RKill cleanup
|
# RKill cleanup
|
||||||
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
|
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
|
||||||
if os.path.exists(desktop_path):
|
if os.path.exists(desktop_path):
|
||||||
for item in os.scandir(desktop_path):
|
for item in os.scandir(desktop_path):
|
||||||
if re.search(r'^RKill', item.name, re.IGNORECASE):
|
if re.search(r'^RKill', item.name, re.IGNORECASE):
|
||||||
dest = re.sub(r'^(.*)\.', '\1_{Date-Time}.'.format(
|
dest = re.sub(r'^(.*)\.', '\1_{Date-Time}.'.format(
|
||||||
**global_vars), item.name)
|
**global_vars), item.name)
|
||||||
dest = r'{ClientDir}\Info\{name}'.format(
|
dest = r'{ClientDir}\Info\{name}'.format(
|
||||||
name=dest, **global_vars)
|
name=dest, **global_vars)
|
||||||
dest = non_clobber_rename(dest)
|
dest = non_clobber_rename(dest)
|
||||||
shutil.move(item.path, dest)
|
shutil.move(item.path, dest)
|
||||||
|
|
||||||
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.")
|
||||||
|
|
|
||||||
643
.bin/Scripts/functions/hw_diags.py
Normal file
643
.bin/Scripts/functions/hw_diags.py
Normal file
|
|
@ -0,0 +1,643 @@
|
||||||
|
# Wizard Kit: Functions - HW Diagnostics
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
from functions.common import *
|
||||||
|
|
||||||
|
# STATIC VARIABLES
|
||||||
|
ATTRIBUTES = {
|
||||||
|
'NVMe': {
|
||||||
|
'critical_warning': {'Error': 1},
|
||||||
|
'media_errors': {'Error': 1},
|
||||||
|
'power_on_hours': {'Warning': 12000, 'Error': 18000, 'Ignore': True},
|
||||||
|
'unsafe_shutdowns': {'Warning': 1},
|
||||||
|
},
|
||||||
|
'SMART': {
|
||||||
|
5: {'Error': 1},
|
||||||
|
9: {'Warning': 12000, 'Error': 18000, 'Ignore': True},
|
||||||
|
10: {'Warning': 1},
|
||||||
|
184: {'Error': 1},
|
||||||
|
187: {'Warning': 1},
|
||||||
|
188: {'Warning': 1},
|
||||||
|
197: {'Error': 1},
|
||||||
|
198: {'Error': 1},
|
||||||
|
201: {'Warning': 1},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
TESTS = {
|
||||||
|
'Prime95': {
|
||||||
|
'Enabled': False,
|
||||||
|
'Status': 'Pending',
|
||||||
|
},
|
||||||
|
'NVMe/SMART': {
|
||||||
|
'Enabled': False,
|
||||||
|
'Quick': False,
|
||||||
|
'Status': {},
|
||||||
|
},
|
||||||
|
'badblocks': {
|
||||||
|
'Enabled': False,
|
||||||
|
'Results': {},
|
||||||
|
'Status': {},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_smart_details(dev):
|
||||||
|
cmd = 'sudo smartctl --all --json /dev/{}'.format(dev).split()
|
||||||
|
result = run_program(cmd, check=False)
|
||||||
|
try:
|
||||||
|
return json.loads(result.stdout.decode())
|
||||||
|
except Exception:
|
||||||
|
# Let other sections deal with the missing data
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def get_status_color(s):
|
||||||
|
color = COLORS['CLEAR']
|
||||||
|
if s in ['Denied', 'NS', 'OVERRIDE', 'Unknown']:
|
||||||
|
color = COLORS['RED']
|
||||||
|
elif s in ['Aborted', 'Working', 'Skipped']:
|
||||||
|
color = COLORS['YELLOW']
|
||||||
|
elif s in ['CS']:
|
||||||
|
color = COLORS['GREEN']
|
||||||
|
return color
|
||||||
|
|
||||||
|
def menu_diags(*args):
|
||||||
|
diag_modes = [
|
||||||
|
{'Name': 'All tests',
|
||||||
|
'Tests': ['Prime95', 'NVMe/SMART', 'badblocks']},
|
||||||
|
{'Name': 'Prime95',
|
||||||
|
'Tests': ['Prime95']},
|
||||||
|
{'Name': 'NVMe/SMART & badblocks',
|
||||||
|
'Tests': ['NVMe/SMART', 'badblocks']},
|
||||||
|
{'Name': 'NVMe/SMART',
|
||||||
|
'Tests': ['NVMe/SMART']},
|
||||||
|
{'Name': 'badblocks',
|
||||||
|
'Tests': ['badblocks']},
|
||||||
|
{'Name': 'Quick drive test',
|
||||||
|
'Tests': ['Quick', 'NVMe/SMART']},
|
||||||
|
]
|
||||||
|
actions = [
|
||||||
|
{'Letter': 'A', 'Name': 'Audio test'},
|
||||||
|
{'Letter': 'N', 'Name': 'Network test'},
|
||||||
|
{'Letter': 'M', 'Name': 'Screen Saver - Matrix', 'CRLF': True},
|
||||||
|
{'Letter': 'P', 'Name': 'Screen Saver - Pipes'},
|
||||||
|
{'Letter': 'Q', 'Name': 'Quit', 'CRLF': True},
|
||||||
|
]
|
||||||
|
|
||||||
|
# Quick disk check
|
||||||
|
if 'quick' in args:
|
||||||
|
run_tests(['Quick', 'NVMe/SMART'])
|
||||||
|
exit_script()
|
||||||
|
|
||||||
|
# Show menu
|
||||||
|
while True:
|
||||||
|
selection = menu_select(
|
||||||
|
title = 'Hardware Diagnostics: Menu',
|
||||||
|
main_entries = diag_modes,
|
||||||
|
action_entries = actions,
|
||||||
|
spacer = '──────────────────────────')
|
||||||
|
if selection.isnumeric():
|
||||||
|
if diag_modes[int(selection)-1]['Name'] != 'Quick drive test':
|
||||||
|
# Save log for non-quick tests
|
||||||
|
ticket_number = get_ticket_number()
|
||||||
|
global_vars['LogDir'] = '{}/Tickets/{}'.format(
|
||||||
|
global_vars['Env']['HOME'],
|
||||||
|
ticket_number)
|
||||||
|
os.makedirs(global_vars['LogDir'], exist_ok=True)
|
||||||
|
global_vars['LogFile'] = '{}/Hardware Diagnostics.log'.format(
|
||||||
|
global_vars['LogDir'])
|
||||||
|
run_tests(diag_modes[int(selection)-1]['Tests'])
|
||||||
|
elif selection == 'A':
|
||||||
|
run_program(['hw-diags-audio'], check=False, pipe=False)
|
||||||
|
sleep(1)
|
||||||
|
elif selection == 'N':
|
||||||
|
run_program(['hw-diags-network'], check=False, pipe=False)
|
||||||
|
sleep(1)
|
||||||
|
elif selection == 'M':
|
||||||
|
run_program(['cmatrix', '-abs'], check=False, pipe=False)
|
||||||
|
elif selection == 'P':
|
||||||
|
run_program(
|
||||||
|
'pipes -t 0 -t 1 -t 2 -t 3 -p 5 -R -r 4000'.split(),
|
||||||
|
check=False, pipe=False)
|
||||||
|
elif selection == 'Q':
|
||||||
|
break
|
||||||
|
|
||||||
|
def run_badblocks():
|
||||||
|
aborted = False
|
||||||
|
clear_screen()
|
||||||
|
print_log('\nStart badblocks test(s)\n')
|
||||||
|
progress_file = '{}/badblocks_progress.out'.format(global_vars['LogDir'])
|
||||||
|
update_progress()
|
||||||
|
|
||||||
|
# Set Window layout and start test
|
||||||
|
run_program('tmux split-window -dhl 15 watch -c -n1 -t cat {}'.format(
|
||||||
|
TESTS['Progress Out']).split())
|
||||||
|
|
||||||
|
# Show disk details
|
||||||
|
for name, dev in sorted(TESTS['badblocks']['Devices'].items()):
|
||||||
|
show_disk_details(dev)
|
||||||
|
print_standard(' ')
|
||||||
|
update_progress()
|
||||||
|
|
||||||
|
# Run
|
||||||
|
print_standard('Running badblock test(s):')
|
||||||
|
for name, dev in sorted(TESTS['badblocks']['Devices'].items()):
|
||||||
|
cur_status = TESTS['badblocks']['Status'][name]
|
||||||
|
nvme_smart_status = TESTS['NVMe/SMART']['Status'].get(name, None)
|
||||||
|
if cur_status == 'Denied':
|
||||||
|
# Skip denied disks
|
||||||
|
continue
|
||||||
|
if nvme_smart_status == 'NS':
|
||||||
|
TESTS['badblocks']['Status'][name] = 'Skipped'
|
||||||
|
else:
|
||||||
|
# Not testing SMART, SMART CS, or SMART OVERRIDE
|
||||||
|
print_standard(' /dev/{:11} '.format(name+'...'), end='', flush=True)
|
||||||
|
run_program('tmux split-window -dl 10 {} {} {}'.format(
|
||||||
|
'hw-diags-badblocks',
|
||||||
|
'/dev/{}'.format(name),
|
||||||
|
progress_file).split())
|
||||||
|
wait_for_process('badblocks')
|
||||||
|
print_standard('Done', timestamp=False)
|
||||||
|
|
||||||
|
# Check results
|
||||||
|
with open(progress_file, 'r') as f:
|
||||||
|
text = f.read()
|
||||||
|
TESTS['badblocks']['Results'][name] = text
|
||||||
|
r = re.search(r'Pass completed.*0/0/0 errors', text)
|
||||||
|
if r:
|
||||||
|
TESTS['badblocks']['Status'][name] = 'CS'
|
||||||
|
else:
|
||||||
|
TESTS['badblocks']['Status'][name] = 'NS'
|
||||||
|
|
||||||
|
# Remove temp file
|
||||||
|
os.remove(progress_file)
|
||||||
|
update_progress()
|
||||||
|
|
||||||
|
# Done
|
||||||
|
run_program('tmux kill-pane -a'.split(), check=False)
|
||||||
|
pass
|
||||||
|
|
||||||
|
def run_mprime():
|
||||||
|
aborted = False
|
||||||
|
clear_screen()
|
||||||
|
print_log('\nStart Prime95 test')
|
||||||
|
TESTS['Prime95']['Status'] = 'Working'
|
||||||
|
update_progress()
|
||||||
|
|
||||||
|
# Set Window layout and start test
|
||||||
|
run_program('tmux split-window -dl 10 -c {wd} {cmd} {wd}'.format(
|
||||||
|
wd=global_vars['TmpDir'], cmd='hw-diags-prime95').split())
|
||||||
|
run_program('tmux split-window -dhl 15 watch -c -n1 -t cat {}'.format(
|
||||||
|
TESTS['Progress Out']).split())
|
||||||
|
run_program('tmux split-window -bd watch -c -n1 -t hw-sensors'.split())
|
||||||
|
run_program('tmux resize-pane -y 3'.split())
|
||||||
|
|
||||||
|
# Start test
|
||||||
|
run_program(['apple-fans', 'max'])
|
||||||
|
print_standard('Running Prime95 for {} minutes'.format(MPRIME_LIMIT))
|
||||||
|
print_warning('If running too hot, press CTL+c to abort the test')
|
||||||
|
try:
|
||||||
|
sleep(int(MPRIME_LIMIT)*60)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
# Catch CTL+C
|
||||||
|
aborted = True
|
||||||
|
|
||||||
|
# Save "final" temps
|
||||||
|
run_program(
|
||||||
|
cmd = 'hw-sensors >> "{}/Final Temps.out"'.format(
|
||||||
|
global_vars['LogDir']).split(),
|
||||||
|
check = False,
|
||||||
|
pipe = False,
|
||||||
|
shell = True)
|
||||||
|
run_program(
|
||||||
|
cmd = 'hw-sensors --nocolor >> "{}/Final Temps.log"'.format(
|
||||||
|
global_vars['LogDir']).split(),
|
||||||
|
check = False,
|
||||||
|
pipe = False,
|
||||||
|
shell = True)
|
||||||
|
|
||||||
|
# Stop test
|
||||||
|
run_program('killall -s INT mprime'.split(), check=False)
|
||||||
|
run_program(['apple-fans', 'auto'])
|
||||||
|
|
||||||
|
# Move logs to Ticket folder
|
||||||
|
for item in os.scandir(global_vars['TmpDir']):
|
||||||
|
try:
|
||||||
|
shutil.move(item.path, global_vars['LogDir'])
|
||||||
|
except Exception:
|
||||||
|
print_error('ERROR: Failed to move "{}" to "{}"'.format(
|
||||||
|
item.path,
|
||||||
|
global_vars['LogDir']))
|
||||||
|
|
||||||
|
# Check logs
|
||||||
|
TESTS['Prime95']['NS'] = False
|
||||||
|
TESTS['Prime95']['CS'] = False
|
||||||
|
log = '{}/results.txt'.format(global_vars['LogDir'])
|
||||||
|
if os.path.exists(log):
|
||||||
|
with open(log, 'r') as f:
|
||||||
|
text = f.read()
|
||||||
|
TESTS['Prime95']['results.txt'] = text
|
||||||
|
r = re.search(r'(error|fail)', text)
|
||||||
|
TESTS['Prime95']['NS'] = bool(r)
|
||||||
|
log = '{}/prime.log'.format(global_vars['LogDir'])
|
||||||
|
if os.path.exists(log):
|
||||||
|
with open(log, 'r') as f:
|
||||||
|
text = f.read()
|
||||||
|
TESTS['Prime95']['prime.log'] = text
|
||||||
|
r = re.search(r'completed.*0 errors, 0 warnings', text)
|
||||||
|
TESTS['Prime95']['CS'] = bool(r)
|
||||||
|
|
||||||
|
# Update status
|
||||||
|
if aborted:
|
||||||
|
TESTS['Prime95']['Status'] = 'Aborted'
|
||||||
|
print_warning('\nAborted.')
|
||||||
|
update_progress()
|
||||||
|
if TESTS['NVMe/SMART']['Enabled'] or TESTS['badblocks']['Enabled']:
|
||||||
|
if not ask('Proceed to next test?'):
|
||||||
|
run_program('tmux kill-pane -a'.split())
|
||||||
|
raise GenericError
|
||||||
|
else:
|
||||||
|
if TESTS['Prime95']['NS']:
|
||||||
|
TESTS['Prime95']['Status'] = 'NS'
|
||||||
|
elif TESTS['Prime95']['CS']:
|
||||||
|
TESTS['Prime95']['Status'] = 'CS'
|
||||||
|
else:
|
||||||
|
TESTS['Prime95']['Status'] = 'Unknown'
|
||||||
|
update_progress()
|
||||||
|
|
||||||
|
# Done
|
||||||
|
run_program('tmux kill-pane -a'.split())
|
||||||
|
|
||||||
|
def run_nvme_smart():
|
||||||
|
aborted = False
|
||||||
|
clear_screen()
|
||||||
|
print_log('\nStart NVMe/SMART test(s)\n')
|
||||||
|
progress_file = '{}/selftest_progress.out'.format(global_vars['LogDir'])
|
||||||
|
update_progress()
|
||||||
|
|
||||||
|
# Set Window layout and start test
|
||||||
|
run_program('tmux split-window -dl 3 watch -c -n1 -t cat {}'.format(
|
||||||
|
progress_file).split())
|
||||||
|
run_program('tmux split-window -dhl 15 watch -c -n1 -t cat {}'.format(
|
||||||
|
TESTS['Progress Out']).split())
|
||||||
|
|
||||||
|
# Show disk details
|
||||||
|
for name, dev in sorted(TESTS['NVMe/SMART']['Devices'].items()):
|
||||||
|
show_disk_details(dev)
|
||||||
|
print_standard(' ')
|
||||||
|
update_progress()
|
||||||
|
|
||||||
|
# Run
|
||||||
|
for name, dev in sorted(TESTS['NVMe/SMART']['Devices'].items()):
|
||||||
|
cur_status = TESTS['NVMe/SMART']['Status'][name]
|
||||||
|
if cur_status == 'OVERRIDE':
|
||||||
|
# Skipping test per user request
|
||||||
|
continue
|
||||||
|
if TESTS['NVMe/SMART']['Quick'] or dev.get('NVMe Disk', False):
|
||||||
|
# Skip SMART self-tests for quick checks and NVMe disks
|
||||||
|
if dev['Quick Health OK']:
|
||||||
|
TESTS['NVMe/SMART']['Status'][name] = 'CS'
|
||||||
|
else:
|
||||||
|
TESTS['NVMe/SMART']['Status'][name] = 'NS'
|
||||||
|
elif not dev['Quick Health OK']:
|
||||||
|
# SMART overall == Failed or attributes bad, avoid self-test
|
||||||
|
TESTS['NVMe/SMART']['Status'][name] = 'NS'
|
||||||
|
else:
|
||||||
|
# Start SMART short self-test
|
||||||
|
test_length = dev['smartctl'].get(
|
||||||
|
'ata_smart_data', {}).get(
|
||||||
|
'self_test', {}).get(
|
||||||
|
'polling_minutes', {}).get(
|
||||||
|
'short', 5)
|
||||||
|
test_length = int(test_length) + 5
|
||||||
|
TESTS['NVMe/SMART']['Status'][name] = 'Working'
|
||||||
|
update_progress()
|
||||||
|
print_standard('Running SMART short self-test(s):')
|
||||||
|
print_standard(
|
||||||
|
' /dev/{:8}({} minutes)... '.format(name, test_length),
|
||||||
|
end='', flush=True)
|
||||||
|
run_program(
|
||||||
|
'sudo smartctl -t short /dev/{}'.format(name).split(),
|
||||||
|
check=False)
|
||||||
|
|
||||||
|
# Wait and show progress (in 10 second increments)
|
||||||
|
for iteration in range(int(test_length*60/10)):
|
||||||
|
# Update SMART data
|
||||||
|
dev['smartctl'] = get_smart_details(name)
|
||||||
|
|
||||||
|
# Check if test is complete
|
||||||
|
if iteration >= 6:
|
||||||
|
done = dev['smartctl'].get(
|
||||||
|
'ata_smart_data', {}).get(
|
||||||
|
'self_test', {}).get(
|
||||||
|
'status', {}).get(
|
||||||
|
'passed', False)
|
||||||
|
if done:
|
||||||
|
break
|
||||||
|
|
||||||
|
# Update progress_file
|
||||||
|
with open(progress_file, 'w') as f:
|
||||||
|
f.write('SMART self-test status:\n {}'.format(
|
||||||
|
dev['smartctl'].get(
|
||||||
|
'ata_smart_data', {}).get(
|
||||||
|
'self_test', {}).get(
|
||||||
|
'status', {}).get(
|
||||||
|
'string', 'unknown')))
|
||||||
|
sleep(10)
|
||||||
|
os.remove(progress_file)
|
||||||
|
|
||||||
|
# Check result
|
||||||
|
test_passed = dev['smartctl'].get(
|
||||||
|
'ata_smart_data', {}).get(
|
||||||
|
'self_test', {}).get(
|
||||||
|
'status', {}).get(
|
||||||
|
'passed', False)
|
||||||
|
if test_passed:
|
||||||
|
TESTS['NVMe/SMART']['Status'][name] = 'CS'
|
||||||
|
else:
|
||||||
|
TESTS['NVMe/SMART']['Status'][name] = 'NS'
|
||||||
|
update_progress()
|
||||||
|
print_standard('Done', timestamp=False)
|
||||||
|
|
||||||
|
# Done
|
||||||
|
run_program('tmux kill-pane -a'.split(), check=False)
|
||||||
|
|
||||||
|
def run_tests(tests):
|
||||||
|
print_log('Starting Hardware Diagnostics')
|
||||||
|
print_log('\nRunning tests: {}'.format(', '.join(tests)))
|
||||||
|
# Enable selected tests
|
||||||
|
for t in ['Prime95', 'NVMe/SMART', 'badblocks']:
|
||||||
|
TESTS[t]['Enabled'] = t in tests
|
||||||
|
TESTS['NVMe/SMART']['Quick'] = 'Quick' in tests
|
||||||
|
|
||||||
|
# Initialize
|
||||||
|
if TESTS['NVMe/SMART']['Enabled'] or TESTS['badblocks']['Enabled']:
|
||||||
|
scan_disks()
|
||||||
|
update_progress()
|
||||||
|
|
||||||
|
# Run
|
||||||
|
mprime_aborted = False
|
||||||
|
if TESTS['Prime95']['Enabled']:
|
||||||
|
try:
|
||||||
|
run_mprime()
|
||||||
|
except GenericError:
|
||||||
|
mprime_aborted = True
|
||||||
|
if not mprime_aborted:
|
||||||
|
if TESTS['NVMe/SMART']['Enabled']:
|
||||||
|
run_nvme_smart()
|
||||||
|
if TESTS['badblocks']['Enabled']:
|
||||||
|
run_badblocks()
|
||||||
|
|
||||||
|
# Show results
|
||||||
|
show_results()
|
||||||
|
|
||||||
|
def scan_disks():
|
||||||
|
clear_screen()
|
||||||
|
|
||||||
|
# Get eligible disk list
|
||||||
|
result = run_program(['lsblk', '-J', '-O'])
|
||||||
|
json_data = json.loads(result.stdout.decode())
|
||||||
|
devs = {}
|
||||||
|
for d in json_data.get('blockdevices', []):
|
||||||
|
if d['type'] == 'disk' and d['hotplug'] == '0':
|
||||||
|
devs[d['name']] = {'lsblk': d}
|
||||||
|
TESTS['NVMe/SMART']['Status'][d['name']] = 'Pending'
|
||||||
|
TESTS['badblocks']['Status'][d['name']] = 'Pending'
|
||||||
|
|
||||||
|
for dev, data in devs.items():
|
||||||
|
# Get SMART attributes
|
||||||
|
run_program(
|
||||||
|
cmd = 'sudo smartctl -s on /dev/{}'.format(dev).split(),
|
||||||
|
check = False)
|
||||||
|
data['smartctl'] = get_smart_details(dev)
|
||||||
|
|
||||||
|
# Get NVMe attributes
|
||||||
|
if data['lsblk']['tran'] == 'nvme':
|
||||||
|
cmd = 'sudo nvme smart-log /dev/{} -o json'.format(dev).split()
|
||||||
|
result = run_program(cmd, check=False)
|
||||||
|
try:
|
||||||
|
data['nvme-cli'] = json.loads(result.stdout.decode())
|
||||||
|
except Exception:
|
||||||
|
# Let other sections deal with the missing data
|
||||||
|
data['nvme-cli'] = {}
|
||||||
|
data['NVMe Disk'] = True
|
||||||
|
|
||||||
|
# Set "Quick Health OK" value
|
||||||
|
## NOTE: If False then require override for badblocks test
|
||||||
|
wanted_smart_list = [
|
||||||
|
'ata_smart_attributes',
|
||||||
|
'ata_smart_data',
|
||||||
|
'smart_status',
|
||||||
|
]
|
||||||
|
if data.get('NVMe Disk', False):
|
||||||
|
crit_warn = data['nvme-cli'].get('critical_warning', 1)
|
||||||
|
data['Quick Health OK'] = True if crit_warn == 0 else False
|
||||||
|
elif set(wanted_smart_list).issubset(data['smartctl'].keys()):
|
||||||
|
data['SMART Pass'] = data['smartctl'].get('smart_status', {}).get(
|
||||||
|
'passed', False)
|
||||||
|
data['Quick Health OK'] = data['SMART Pass']
|
||||||
|
data['SMART Support'] = True
|
||||||
|
else:
|
||||||
|
data['Quick Health OK'] = False
|
||||||
|
data['SMART Support'] = False
|
||||||
|
|
||||||
|
# Ask for manual overrides if necessary
|
||||||
|
if not data['Quick Health OK'] and TESTS['badblocks']['Enabled']:
|
||||||
|
show_disk_details(data)
|
||||||
|
print_warning("WARNING: Health can't be confirmed for: {}".format(
|
||||||
|
'/dev/{}'.format(dev)))
|
||||||
|
dev_name = data['lsblk']['name']
|
||||||
|
print_standard(' ')
|
||||||
|
if ask('Run badblocks for this device anyway?'):
|
||||||
|
TESTS['NVMe/SMART']['Status'][dev_name] = 'OVERRIDE'
|
||||||
|
else:
|
||||||
|
TESTS['NVMe/SMART']['Status'][dev_name] = 'NS'
|
||||||
|
TESTS['badblocks']['Status'][dev_name] = 'Denied'
|
||||||
|
print_standard(' ') # In case there's more than one "OVERRIDE" disk
|
||||||
|
|
||||||
|
TESTS['NVMe/SMART']['Devices'] = devs
|
||||||
|
TESTS['badblocks']['Devices'] = devs
|
||||||
|
|
||||||
|
def show_disk_details(dev):
|
||||||
|
dev_name = dev['lsblk']['name']
|
||||||
|
# Device description
|
||||||
|
print_info('Device: /dev/{}'.format(dev['lsblk']['name']))
|
||||||
|
for key in ['model', 'size', 'serial']:
|
||||||
|
print_standard(' {:8}{}'.format(key, dev['lsblk'].get(key, 'Unknown')))
|
||||||
|
if dev['lsblk'].get('tran', 'Unknown') == 'nvme':
|
||||||
|
print_standard(' {:8}{}'.format('type', 'NVMe'))
|
||||||
|
else:
|
||||||
|
print_standard(' {:8}{}'.format(
|
||||||
|
'type',
|
||||||
|
dev['lsblk'].get('tran', 'Unknown').upper()))
|
||||||
|
|
||||||
|
# Warnings
|
||||||
|
if dev.get('NVMe Disk', False):
|
||||||
|
if dev['Quick Health OK']:
|
||||||
|
print_warning('WARNING: NVMe support is still experimental')
|
||||||
|
else:
|
||||||
|
print_error('ERROR: NVMe disk is reporting critical warnings')
|
||||||
|
elif not dev['SMART Support']:
|
||||||
|
print_error('ERROR: Unable to retrieve SMART data')
|
||||||
|
elif not dev['SMART Pass']:
|
||||||
|
print_error('ERROR: SMART overall-health assessment result: FAILED')
|
||||||
|
|
||||||
|
# Attributes
|
||||||
|
if dev.get('NVMe Disk', False):
|
||||||
|
print_info('Attributes:')
|
||||||
|
for attrib, threshold in sorted(ATTRIBUTES['NVMe'].items()):
|
||||||
|
if attrib in dev['nvme-cli']:
|
||||||
|
print_standard(
|
||||||
|
' {:37}'.format(attrib.replace('_', ' ').title()),
|
||||||
|
end='', flush=True)
|
||||||
|
raw_num = dev['nvme-cli'][attrib]
|
||||||
|
raw_str = str(raw_num)
|
||||||
|
if (threshold.get('Error', False) and
|
||||||
|
raw_num >= threshold.get('Error', -1)):
|
||||||
|
print_error(raw_str, timestamp=False)
|
||||||
|
if not threshold.get('Ignore', False):
|
||||||
|
dev['Quick Health OK'] = False
|
||||||
|
TESTS['NVMe/SMART']['Status'][dev_name] = 'NS'
|
||||||
|
elif (threshold.get('Warning', False) and
|
||||||
|
raw_num >= threshold.get('Warning', -1)):
|
||||||
|
print_warning(raw_str, timestamp=False)
|
||||||
|
else:
|
||||||
|
print_success(raw_str, timestamp=False)
|
||||||
|
elif dev['smartctl'].get('ata_smart_attributes', None):
|
||||||
|
# SMART attributes
|
||||||
|
print_info('Attributes:')
|
||||||
|
s_table = dev['smartctl'].get('ata_smart_attributes', {}).get(
|
||||||
|
'table', {})
|
||||||
|
s_table = {a.get('id', 'Unknown'): a for a in s_table}
|
||||||
|
for attrib, threshold in sorted(ATTRIBUTES['SMART'].items()):
|
||||||
|
if attrib in s_table:
|
||||||
|
print_standard(
|
||||||
|
' {:>3} {:32}'.format(
|
||||||
|
attrib,
|
||||||
|
s_table[attrib]['name']).replace('_', ' ').title(),
|
||||||
|
end='', flush=True)
|
||||||
|
raw_str = s_table[attrib]['raw']['string']
|
||||||
|
raw_num = re.sub(r'^(\d+).*$', r'\1', raw_str)
|
||||||
|
try:
|
||||||
|
raw_num = float(raw_num)
|
||||||
|
except ValueError:
|
||||||
|
# Not sure about this one, print raw_str without color?
|
||||||
|
print_standard(raw_str, timestamp=False)
|
||||||
|
continue
|
||||||
|
if (threshold.get('Error', False) and
|
||||||
|
raw_num >= threshold.get('Error', -1)):
|
||||||
|
print_error(raw_str, timestamp=False)
|
||||||
|
if not threshold.get('Ignore', False):
|
||||||
|
dev['Quick Health OK'] = False
|
||||||
|
TESTS['NVMe/SMART']['Status'][dev_name] = 'NS'
|
||||||
|
elif (threshold.get('Warning', False) and
|
||||||
|
raw_num >= threshold.get('Warning', -1)):
|
||||||
|
print_warning(raw_str, timestamp=False)
|
||||||
|
else:
|
||||||
|
print_success(raw_str, timestamp=False)
|
||||||
|
|
||||||
|
def show_results():
|
||||||
|
clear_screen()
|
||||||
|
print_standard('Hardware Diagnostic Results')
|
||||||
|
update_progress()
|
||||||
|
|
||||||
|
# Set Window layout and show progress
|
||||||
|
run_program('tmux split-window -dhl 15 watch -c -n1 -t cat {}'.format(
|
||||||
|
TESTS['Progress Out']).split())
|
||||||
|
|
||||||
|
# Prime95
|
||||||
|
if TESTS['Prime95']['Enabled']:
|
||||||
|
print_success('\nPrime95:')
|
||||||
|
for log, regex in [
|
||||||
|
['results.txt', r'(error|fail)'],
|
||||||
|
['prime.log', r'completed.*0 errors, 0 warnings']]:
|
||||||
|
if log in TESTS['Prime95']:
|
||||||
|
print_info('Log: {}'.format(log))
|
||||||
|
lines = [line.strip() for line
|
||||||
|
in TESTS['Prime95'][log].splitlines()
|
||||||
|
if re.search(regex, line, re.IGNORECASE)]
|
||||||
|
for line in lines[-4:]:
|
||||||
|
line = re.sub(r'^.*Worker #\d.*Torture Test (.*)', r'\1',
|
||||||
|
line, re.IGNORECASE)
|
||||||
|
if TESTS['Prime95'].get('NS', False):
|
||||||
|
print_error(' {}'.format(line))
|
||||||
|
else:
|
||||||
|
print_standard(' {}'.format(line))
|
||||||
|
print_info('Final temps')
|
||||||
|
print_log(' See Final Temps.log')
|
||||||
|
with open('{}/Final Temps.out'.format(global_vars['LogDir']), 'r') as f:
|
||||||
|
for line in f.readlines():
|
||||||
|
if re.search(r'^\s*$', line.strip()):
|
||||||
|
# Stop after coretemps (which should be first)
|
||||||
|
break
|
||||||
|
print(' {}'.format(line.strip()))
|
||||||
|
print_standard(' ')
|
||||||
|
|
||||||
|
# NVMe/SMART / badblocks
|
||||||
|
if TESTS['NVMe/SMART']['Enabled'] or TESTS['badblocks']['Enabled']:
|
||||||
|
print_success('Disks:')
|
||||||
|
for name, dev in sorted(TESTS['NVMe/SMART']['Devices'].items()):
|
||||||
|
show_disk_details(dev)
|
||||||
|
bb_status = TESTS['badblocks']['Status'].get(name, None)
|
||||||
|
if (TESTS['badblocks']['Enabled']
|
||||||
|
and bb_status not in ['Denied', 'OVERRIDE', 'Skipped']):
|
||||||
|
print_info('badblocks:')
|
||||||
|
result = TESTS['badblocks']['Results'].get(name, '')
|
||||||
|
for line in result.splitlines():
|
||||||
|
if re.search(r'Pass completed', line, re.IGNORECASE):
|
||||||
|
line = re.sub(
|
||||||
|
r'Pass completed,?\s+', r'',
|
||||||
|
line.strip(), re.IGNORECASE)
|
||||||
|
if TESTS['badblocks']['Status'][name] == 'CS':
|
||||||
|
print_standard(' {}'.format(line))
|
||||||
|
else:
|
||||||
|
print_error(' {}'.format(line))
|
||||||
|
print_standard(' ')
|
||||||
|
|
||||||
|
# Done
|
||||||
|
pause('Press Enter to return to main menu... ')
|
||||||
|
run_program('tmux kill-pane -a'.split())
|
||||||
|
|
||||||
|
def update_progress():
|
||||||
|
if 'Progress Out' not in TESTS:
|
||||||
|
TESTS['Progress Out'] = '{}/progress.out'.format(global_vars['LogDir'])
|
||||||
|
output = []
|
||||||
|
output.append('{BLUE}HW Diagnostics{CLEAR}'.format(**COLORS))
|
||||||
|
output.append('───────────────')
|
||||||
|
if TESTS['Prime95']['Enabled']:
|
||||||
|
output.append(' ')
|
||||||
|
output.append('{BLUE}Prime95{s_color}{status:>8}{CLEAR}'.format(
|
||||||
|
s_color = get_status_color(TESTS['Prime95']['Status']),
|
||||||
|
status = TESTS['Prime95']['Status'],
|
||||||
|
**COLORS))
|
||||||
|
if TESTS['NVMe/SMART']['Enabled']:
|
||||||
|
output.append(' ')
|
||||||
|
output.append('{BLUE}NVMe / SMART{CLEAR}'.format(**COLORS))
|
||||||
|
if TESTS['NVMe/SMART']['Quick']:
|
||||||
|
output.append('{YELLOW} (Quick Check){CLEAR}'.format(**COLORS))
|
||||||
|
for dev, status in sorted(TESTS['NVMe/SMART']['Status'].items()):
|
||||||
|
output.append('{dev}{s_color}{status:>{pad}}{CLEAR}'.format(
|
||||||
|
dev = dev,
|
||||||
|
pad = 15-len(dev),
|
||||||
|
s_color = get_status_color(status),
|
||||||
|
status = status,
|
||||||
|
**COLORS))
|
||||||
|
if TESTS['badblocks']['Enabled']:
|
||||||
|
output.append(' ')
|
||||||
|
output.append('{BLUE}badblocks{CLEAR}'.format(**COLORS))
|
||||||
|
for dev, status in sorted(TESTS['badblocks']['Status'].items()):
|
||||||
|
output.append('{dev}{s_color}{status:>{pad}}{CLEAR}'.format(
|
||||||
|
dev = dev,
|
||||||
|
pad = 15-len(dev),
|
||||||
|
s_color = get_status_color(status),
|
||||||
|
status = status,
|
||||||
|
**COLORS))
|
||||||
|
|
||||||
|
# Add line-endings
|
||||||
|
output = ['{}\n'.format(line) for line in output]
|
||||||
|
|
||||||
|
with open(TESTS['Progress Out'], 'w') as f:
|
||||||
|
f.writelines(output)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
|
@ -1,467 +1,467 @@
|
||||||
# Wizard Kit: Functions - Information
|
# Wizard Kit: Functions - Information
|
||||||
|
|
||||||
from borrowed import knownpaths
|
from borrowed import knownpaths
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
from functions.activation import *
|
from functions.activation import *
|
||||||
|
|
||||||
# Regex
|
# Regex
|
||||||
REGEX_OFFICE = re.compile(
|
REGEX_OFFICE = re.compile(
|
||||||
r'(Microsoft (Office\s+'
|
r'(Microsoft (Office\s+'
|
||||||
r'(365|Enterprise|Home|Pro(\s|fessional)'
|
r'(365|Enterprise|Home|Pro(\s|fessional)'
|
||||||
r'|Single|Small|Standard|Starter|Ultimate|system)'
|
r'|Single|Small|Standard|Starter|Ultimate|system)'
|
||||||
r'|Works[-\s\d]+\d)'
|
r'|Works[-\s\d]+\d)'
|
||||||
r'|(Libre|Open|Star)\s*Office'
|
r'|(Libre|Open|Star)\s*Office'
|
||||||
r'|WordPerfect|Gnumeric|Abiword)',
|
r'|WordPerfect|Gnumeric|Abiword)',
|
||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
|
|
||||||
# STATIC VARIABLES
|
# STATIC VARIABLES
|
||||||
REG_PROFILE_LIST = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
|
REG_PROFILE_LIST = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
|
||||||
REG_SHELL_FOLDERS = r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders'
|
REG_SHELL_FOLDERS = r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders'
|
||||||
TMP_HIVE_PATH = 'TEMP_HIVE_MOUNT'
|
TMP_HIVE_PATH = 'TEMP_HIVE_MOUNT'
|
||||||
EXTRA_FOLDERS = [
|
EXTRA_FOLDERS = [
|
||||||
'Dropbox',
|
'Dropbox',
|
||||||
'Google Drive',
|
'Google Drive',
|
||||||
'OneDrive',
|
'OneDrive',
|
||||||
'SkyDrive',
|
'SkyDrive',
|
||||||
]
|
]
|
||||||
SHELL_FOLDERS = {
|
SHELL_FOLDERS = {
|
||||||
#GUIDs from: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx
|
#GUIDs from: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx
|
||||||
'Desktop': (
|
'Desktop': (
|
||||||
'{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}',
|
'{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}',
|
||||||
),
|
),
|
||||||
'Documents': (
|
'Documents': (
|
||||||
'Personal',
|
'Personal',
|
||||||
'{FDD39AD0-238F-46AF-ADB4-6C85480369C7}',
|
'{FDD39AD0-238F-46AF-ADB4-6C85480369C7}',
|
||||||
),
|
),
|
||||||
'Downloads': (
|
'Downloads': (
|
||||||
'{374DE290-123F-4565-9164-39C4925E467B}',
|
'{374DE290-123F-4565-9164-39C4925E467B}',
|
||||||
),
|
),
|
||||||
'Favorites': (
|
'Favorites': (
|
||||||
'{1777F761-68AD-4D8A-87BD-30B759FA33DD}',
|
'{1777F761-68AD-4D8A-87BD-30B759FA33DD}',
|
||||||
),
|
),
|
||||||
'Music': (
|
'Music': (
|
||||||
'My Music',
|
'My Music',
|
||||||
'{4BD8D571-6D19-48D3-BE97-422220080E43}',
|
'{4BD8D571-6D19-48D3-BE97-422220080E43}',
|
||||||
),
|
),
|
||||||
'Pictures': (
|
'Pictures': (
|
||||||
'My Pictures',
|
'My Pictures',
|
||||||
'{33E28130-4E1E-4676-835A-98395C3BC3BB}',
|
'{33E28130-4E1E-4676-835A-98395C3BC3BB}',
|
||||||
),
|
),
|
||||||
'Videos': (
|
'Videos': (
|
||||||
'My Video',
|
'My Video',
|
||||||
'{18989B1D-99B5-455B-841C-AB7C74E4DDFC}',
|
'{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."""
|
||||||
extract_item('Everything', silent=True)
|
extract_item('Everything', silent=True)
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['Everything'],
|
global_vars['Tools']['Everything'],
|
||||||
'-nodb',
|
'-nodb',
|
||||||
'-create-filelist',
|
'-create-filelist',
|
||||||
r'{LogDir}\File List.txt'.format(**global_vars),
|
r'{LogDir}\File List.txt'.format(**global_vars),
|
||||||
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'.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)]
|
||||||
for p in plans:
|
for p in 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\{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():
|
||||||
"""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'.format(**global_vars),
|
||||||
'sysreg',
|
'sysreg',
|
||||||
'curuser',
|
'curuser',
|
||||||
'otherusers',
|
'otherusers',
|
||||||
'/noprogresswindow']
|
'/noprogresswindow']
|
||||||
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'
|
||||||
cmd = [global_vars['Tools']['Du'], '-nobanner', '-q', path]
|
cmd = [global_vars['Tools']['Du'], '-nobanner', '-q', path]
|
||||||
try:
|
try:
|
||||||
out = run_program(cmd)
|
out = run_program(cmd)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
# Failed to find folder
|
# Failed to find folder
|
||||||
pass
|
pass
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
# Failed to get folder size
|
# Failed to get folder size
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
size = out.stdout.decode().splitlines()[4]
|
size = out.stdout.decode().splitlines()[4]
|
||||||
size = re.sub(r'Size:\s+([\d,]+)\sbytes$', r'\1', size)
|
size = re.sub(r'Size:\s+([\d,]+)\sbytes$', r'\1', size)
|
||||||
size = size.replace(',', '')
|
size = size.replace(',', '')
|
||||||
size = human_readable_size(size)
|
size = human_readable_size(size)
|
||||||
return size
|
return size
|
||||||
|
|
||||||
def get_installed_office():
|
def get_installed_office():
|
||||||
"""Get list of installed Office programs."""
|
"""Get list of installed Office programs."""
|
||||||
programs = []
|
programs = []
|
||||||
log_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format(
|
log_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format(
|
||||||
**global_vars)
|
**global_vars)
|
||||||
with open (log_file, 'r') as f:
|
with open (log_file, 'r') as f:
|
||||||
for line in sorted(f.readlines()):
|
for line in sorted(f.readlines()):
|
||||||
if REGEX_OFFICE.search(line):
|
if REGEX_OFFICE.search(line):
|
||||||
programs.append(line[4:82].strip())
|
programs.append(line[4:82].strip())
|
||||||
|
|
||||||
if len(programs) == 0:
|
if len(programs) == 0:
|
||||||
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 SHGetKnownFolderPath via 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
|
||||||
"""
|
"""
|
||||||
path = None
|
path = None
|
||||||
folderid = None
|
folderid = None
|
||||||
if user.lower() == 'public':
|
if user.lower() == 'public':
|
||||||
user = 'common'
|
user = 'common'
|
||||||
try:
|
try:
|
||||||
folderid = getattr(knownpaths.FOLDERID, folder)
|
folderid = getattr(knownpaths.FOLDERID, folder)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
# Unknown folder ID, ignore and return None
|
# Unknown folder ID, ignore and return None
|
||||||
pass
|
pass
|
||||||
|
|
||||||
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']
|
||||||
paths = {
|
paths = {
|
||||||
'Profile': {
|
'Profile': {
|
||||||
'Path': None,
|
'Path': None,
|
||||||
},
|
},
|
||||||
'Shell Folders': {},
|
'Shell Folders': {},
|
||||||
'Extra Folders': {},
|
'Extra Folders': {},
|
||||||
}
|
}
|
||||||
unload_hive = False
|
unload_hive = False
|
||||||
|
|
||||||
if user['Name'] == global_vars['Env']['USERNAME']:
|
if user['Name'] == global_vars['Env']['USERNAME']:
|
||||||
# We can use SHGetKnownFolderPath for the current user
|
# We can use SHGetKnownFolderPath for the current user
|
||||||
paths['Profile']['Path'] = get_shell_path('Profile')
|
paths['Profile']['Path'] = get_shell_path('Profile')
|
||||||
paths['Shell Folders'] = {f: {'Path': get_shell_path(f)}
|
paths['Shell Folders'] = {f: {'Path': get_shell_path(f)}
|
||||||
for f in SHELL_FOLDERS.keys()}
|
for f in SHELL_FOLDERS.keys()}
|
||||||
else:
|
else:
|
||||||
# We have to use the NTUSER.dat hives which isn't recommended by MS
|
# We have to use the NTUSER.dat hives which isn't recommended by MS
|
||||||
try:
|
try:
|
||||||
key_path = r'{}\{}'.format(REG_PROFILE_LIST, user['SID'])
|
key_path = r'{}\{}'.format(REG_PROFILE_LIST, user['SID'])
|
||||||
with winreg.OpenKey(HKLM, key_path) as key:
|
with winreg.OpenKey(HKLM, key_path) as key:
|
||||||
paths['Profile']['Path'] = winreg.QueryValueEx(
|
paths['Profile']['Path'] = winreg.QueryValueEx(
|
||||||
key, 'ProfileImagePath')[0]
|
key, 'ProfileImagePath')[0]
|
||||||
except Exception:
|
except Exception:
|
||||||
# Profile path not found, leaving as None.
|
# Profile path not found, leaving as None.
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Shell folders (Prep)
|
# Shell folders (Prep)
|
||||||
if not reg_path_exists(HKU, hive_path) and paths['Profile']['Path']:
|
if not reg_path_exists(HKU, hive_path) and paths['Profile']['Path']:
|
||||||
# User not logged-in, loading hive
|
# User not logged-in, loading hive
|
||||||
# Also setting unload_hive so it will be unloaded later.
|
# Also setting unload_hive so it will be unloaded later.
|
||||||
hive_path = TMP_HIVE_PATH
|
hive_path = TMP_HIVE_PATH
|
||||||
cmd = ['reg', 'load', r'HKU\{}'.format(TMP_HIVE_PATH),
|
cmd = ['reg', 'load', r'HKU\{}'.format(TMP_HIVE_PATH),
|
||||||
r'{}\NTUSER.DAT'.format(paths['Profile']['Path'])]
|
r'{}\NTUSER.DAT'.format(paths['Profile']['Path'])]
|
||||||
unload_hive = True
|
unload_hive = True
|
||||||
try:
|
try:
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
# Failed to load user hive
|
# Failed to load user hive
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Shell folders
|
# Shell folders
|
||||||
shell_folders = r'{}\{}'.format(hive_path, REG_SHELL_FOLDERS)
|
shell_folders = r'{}\{}'.format(hive_path, REG_SHELL_FOLDERS)
|
||||||
if (reg_path_exists(HKU, hive_path)
|
if (reg_path_exists(HKU, hive_path)
|
||||||
and reg_path_exists(HKU, shell_folders)):
|
and reg_path_exists(HKU, shell_folders)):
|
||||||
with winreg.OpenKey(HKU, shell_folders) as key:
|
with winreg.OpenKey(HKU, shell_folders) as key:
|
||||||
for folder, values in SHELL_FOLDERS.items():
|
for folder, values in SHELL_FOLDERS.items():
|
||||||
for value in values:
|
for value in values:
|
||||||
try:
|
try:
|
||||||
path = winreg.QueryValueEx(key, value)[0]
|
path = winreg.QueryValueEx(key, value)[0]
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
# Skip missing values
|
# Skip missing values
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
paths['Shell Folders'][folder] = {'Path': path}
|
paths['Shell Folders'][folder] = {'Path': path}
|
||||||
# Stop checking values for this folder
|
# Stop checking values for this folder
|
||||||
break
|
break
|
||||||
|
|
||||||
# Shell folder (extra check)
|
# Shell folder (extra check)
|
||||||
if paths['Profile']['Path']:
|
if paths['Profile']['Path']:
|
||||||
for folder in SHELL_FOLDERS.keys():
|
for folder in SHELL_FOLDERS.keys():
|
||||||
folder_path = r'{Path}\{folder}'.format(
|
folder_path = r'{Path}\{folder}'.format(
|
||||||
folder=folder, **paths['Profile'])
|
folder=folder, **paths['Profile'])
|
||||||
if (folder not in paths['Shell Folders']
|
if (folder not in paths['Shell Folders']
|
||||||
and os.path.exists(folder_path)):
|
and os.path.exists(folder_path)):
|
||||||
paths['Shell Folders'][folder] = {'Path': folder_path}
|
paths['Shell Folders'][folder] = {'Path': folder_path}
|
||||||
|
|
||||||
# Extra folders
|
# Extra folders
|
||||||
if paths['Profile']['Path']:
|
if paths['Profile']['Path']:
|
||||||
for folder in EXTRA_FOLDERS:
|
for folder in EXTRA_FOLDERS:
|
||||||
folder_path = r'{Path}\{folder}'.format(
|
folder_path = r'{Path}\{folder}'.format(
|
||||||
folder=folder, **paths['Profile'])
|
folder=folder, **paths['Profile'])
|
||||||
if os.path.exists(folder_path):
|
if os.path.exists(folder_path):
|
||||||
paths['Extra Folders'][folder] = {'Path': folder_path}
|
paths['Extra Folders'][folder] = {'Path': folder_path}
|
||||||
|
|
||||||
# Shell folders (cleanup)
|
# Shell folders (cleanup)
|
||||||
if unload_hive:
|
if unload_hive:
|
||||||
cmd = ['reg', 'unload', r'HKU\{}'.format(TMP_HIVE_PATH)]
|
cmd = ['reg', 'unload', r'HKU\{}'.format(TMP_HIVE_PATH)]
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
# 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)
|
||||||
# Configure Du
|
# Configure Du
|
||||||
winreg.CreateKey(HKCU, r'Software\Sysinternals\Du')
|
winreg.CreateKey(HKCU, r'Software\Sysinternals\Du')
|
||||||
with winreg.OpenKey(HKCU,
|
with winreg.OpenKey(HKCU,
|
||||||
r'Software\Sysinternals\Du', access=winreg.KEY_WRITE) as key:
|
r'Software\Sysinternals\Du', access=winreg.KEY_WRITE) as key:
|
||||||
winreg.SetValueEx(key, 'EulaAccepted', 0, winreg.REG_DWORD, 1)
|
winreg.SetValueEx(key, 'EulaAccepted', 0, winreg.REG_DWORD, 1)
|
||||||
|
|
||||||
for u in users:
|
for u in users:
|
||||||
u.update(get_user_data_paths(u))
|
u.update(get_user_data_paths(u))
|
||||||
if u['Profile']['Path']:
|
if u['Profile']['Path']:
|
||||||
u['Profile']['Size'] = get_folder_size(u['Profile']['Path'])
|
u['Profile']['Size'] = get_folder_size(u['Profile']['Path'])
|
||||||
for folder in u['Shell Folders'].keys():
|
for folder in u['Shell Folders'].keys():
|
||||||
u['Shell Folders'][folder]['Size'] = get_folder_size(
|
u['Shell Folders'][folder]['Size'] = get_folder_size(
|
||||||
u['Shell Folders'][folder]['Path'])
|
u['Shell Folders'][folder]['Path'])
|
||||||
for folder in u['Extra Folders'].keys():
|
for folder in u['Extra Folders'].keys():
|
||||||
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 = []
|
||||||
|
|
||||||
# Get user info from WMI
|
# Get user info from WMI
|
||||||
cmd = ['wmic', 'useraccount', 'get', '/format:csv']
|
cmd = ['wmic', 'useraccount', 'get', '/format:csv']
|
||||||
try:
|
try:
|
||||||
out = run_program(cmd)
|
out = run_program(cmd)
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
# Meh, return empty list to avoid a full crash
|
# Meh, return empty list to avoid a full crash
|
||||||
return users
|
return users
|
||||||
|
|
||||||
entries = out.stdout.decode().splitlines()
|
entries = out.stdout.decode().splitlines()
|
||||||
entries = [e.strip().split(',') for e in entries if e.strip()]
|
entries = [e.strip().split(',') for e in entries if e.strip()]
|
||||||
|
|
||||||
# Add user(s) to dict
|
# Add user(s) to dict
|
||||||
keys = entries[0]
|
keys = entries[0]
|
||||||
for e in entries[1:]:
|
for e in entries[1:]:
|
||||||
# Create dict using 1st line (keys)
|
# Create dict using 1st line (keys)
|
||||||
e = dict(zip(keys, e))
|
e = dict(zip(keys, e))
|
||||||
# Set Active status via 'Disabled' TRUE/FALSE str
|
# Set Active status via 'Disabled' TRUE/FALSE str
|
||||||
e['Active'] = bool(e['Disabled'].upper() == 'FALSE')
|
e['Active'] = bool(e['Disabled'].upper() == 'FALSE')
|
||||||
# Assume SIDs ending with 1000+ are "Standard" and others are "System"
|
# Assume SIDs ending with 1000+ are "Standard" and others are "System"
|
||||||
e['Type'] = 'Standard' if re.search(r'-1\d+$', e['SID']) else 'System'
|
e['Type'] = 'Standard' if re.search(r'-1\d+$', e['SID']) else 'System'
|
||||||
users.append(e)
|
users.append(e)
|
||||||
|
|
||||||
# Sort list
|
# Sort list
|
||||||
users.sort(key=itemgetter('Name'))
|
users.sort(key=itemgetter('Name'))
|
||||||
|
|
||||||
# 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:
|
||||||
winreg.QueryValue(hive, path)
|
winreg.QueryValue(hive, path)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
return False
|
return False
|
||||||
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)
|
||||||
# All system info
|
# All system info
|
||||||
config = r'{BinDir}\AIDA64\full.rpf'.format(**global_vars)
|
config = r'{BinDir}\AIDA64\full.rpf'.format(**global_vars)
|
||||||
report_file = r'{LogDir}\System Information (AIDA64).html'.format(
|
report_file = r'{LogDir}\System Information (AIDA64).html'.format(
|
||||||
**global_vars)
|
**global_vars)
|
||||||
if not os.path.exists(report_file):
|
if not os.path.exists(report_file):
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['AIDA64'],
|
global_vars['Tools']['AIDA64'],
|
||||||
'/R', report_file,
|
'/R', report_file,
|
||||||
'/CUSTOM', config,
|
'/CUSTOM', config,
|
||||||
'/HTML', '/SILENT', '/SAFEST']
|
'/HTML', '/SILENT', '/SAFEST']
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
# Installed Programs
|
# Installed Programs
|
||||||
config = r'{BinDir}\AIDA64\installed_programs.rpf'.format(**global_vars)
|
config = r'{BinDir}\AIDA64\installed_programs.rpf'.format(**global_vars)
|
||||||
report_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format(
|
report_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format(
|
||||||
**global_vars)
|
**global_vars)
|
||||||
if not os.path.exists(report_file):
|
if not os.path.exists(report_file):
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['AIDA64'],
|
global_vars['Tools']['AIDA64'],
|
||||||
'/R', report_file,
|
'/R', report_file,
|
||||||
'/CUSTOM', config,
|
'/CUSTOM', config,
|
||||||
'/TEXT', '/SILENT', '/SAFEST']
|
'/TEXT', '/SILENT', '/SAFEST']
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
# Product Keys
|
# Product Keys
|
||||||
config = r'{BinDir}\AIDA64\licenses.rpf'.format(**global_vars)
|
config = r'{BinDir}\AIDA64\licenses.rpf'.format(**global_vars)
|
||||||
report_file = r'{LogDir}\Product Keys (AIDA64).txt'.format(**global_vars)
|
report_file = r'{LogDir}\Product Keys (AIDA64).txt'.format(**global_vars)
|
||||||
if not os.path.exists(report_file):
|
if not os.path.exists(report_file):
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['AIDA64'],
|
global_vars['Tools']['AIDA64'],
|
||||||
'/R', report_file,
|
'/R', report_file,
|
||||||
'/CUSTOM', config,
|
'/CUSTOM', config,
|
||||||
'/TEXT', '/SILENT', '/SAFEST']
|
'/TEXT', '/SILENT', '/SAFEST']
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
def run_bleachbit():
|
def run_bleachbit():
|
||||||
"""Run BleachBit preview and save log.
|
"""Run BleachBit preview and save log.
|
||||||
|
|
||||||
This is a preview so no files should be deleted."""
|
This is a preview so no files should be deleted."""
|
||||||
if not os.path.exists(global_vars['LogDir']+r'\BleachBit.log'):
|
if not os.path.exists(global_vars['LogDir']+r'\BleachBit.log'):
|
||||||
extract_item('BleachBit', silent=True)
|
extract_item('BleachBit', silent=True)
|
||||||
cmd = [global_vars['Tools']['BleachBit'], '--preview', '--preset']
|
cmd = [global_vars['Tools']['BleachBit'], '--preview', '--preset']
|
||||||
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(global_vars['LogDir']+r'\BleachBit.err', '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(global_vars['LogDir']+r'\BleachBit.log', '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('/', ' ')),
|
||||||
end='', flush=True, timestamp=False)
|
end='', flush=True, timestamp=False)
|
||||||
try:
|
try:
|
||||||
usage = psutil.disk_usage(disk.device)
|
usage = psutil.disk_usage(disk.device)
|
||||||
display_string = '{percent:>5.2f}% Free ({free} / {total})'.format(
|
display_string = '{percent:>5.2f}% Free ({free} / {total})'.format(
|
||||||
percent = 100 - usage.percent,
|
percent = 100 - usage.percent,
|
||||||
free = human_readable_size(usage.free, 2),
|
free = human_readable_size(usage.free, 2),
|
||||||
total = human_readable_size(usage.total, 2))
|
total = human_readable_size(usage.total, 2))
|
||||||
if usage.percent > 85:
|
if usage.percent > 85:
|
||||||
print_error(display_string, timestamp=False)
|
print_error(display_string, timestamp=False)
|
||||||
elif usage.percent > 75:
|
elif usage.percent > 75:
|
||||||
print_warning(display_string, timestamp=False)
|
print_warning(display_string, timestamp=False)
|
||||||
else:
|
else:
|
||||||
print_standard(display_string, timestamp=False)
|
print_standard(display_string, timestamp=False)
|
||||||
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:'
|
||||||
for disk in psutil.disk_partitions():
|
for disk in psutil.disk_partitions():
|
||||||
try:
|
try:
|
||||||
if 'fixed' in disk.opts:
|
if 'fixed' in disk.opts:
|
||||||
try_and_print(message=message, function=show_disk_usage,
|
try_and_print(message=message, function=show_disk_usage,
|
||||||
ns='Unknown', silent_function=False,
|
ns='Unknown', silent_function=False,
|
||||||
indent=indent, width=width, disk=disk)
|
indent=indent, width=width, disk=disk)
|
||||||
message = ''
|
message = ''
|
||||||
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()
|
||||||
if mem.total > 5905580032:
|
if mem.total > 5905580032:
|
||||||
# > 5.5 Gb so 6Gb or greater
|
# > 5.5 Gb so 6Gb or greater
|
||||||
print_standard(human_readable_size(mem.total).strip(), timestamp=False)
|
print_standard(human_readable_size(mem.total).strip(), timestamp=False)
|
||||||
elif mem.total > 3758096384:
|
elif mem.total > 3758096384:
|
||||||
# > 3.5 Gb so 4Gb or greater
|
# > 3.5 Gb so 4Gb or greater
|
||||||
print_warning(human_readable_size(mem.total).strip(), timestamp=False)
|
print_warning(human_readable_size(mem.total).strip(), timestamp=False)
|
||||||
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()
|
||||||
if windows_is_activated():
|
if windows_is_activated():
|
||||||
print_standard(act_str, timestamp=False)
|
print_standard(act_str, timestamp=False)
|
||||||
elif re.search(r'unavailable', act_str, re.IGNORECASE):
|
elif re.search(r'unavailable', act_str, re.IGNORECASE):
|
||||||
print_warning(act_str, timestamp=False)
|
print_warning(act_str, timestamp=False)
|
||||||
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']
|
||||||
if global_vars['OS']['Arch'] == 32:
|
if global_vars['OS']['Arch'] == 32:
|
||||||
# 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'(unrecognized|very outdated)', os_name, re.IGNORECASE):
|
if re.search(r'(unrecognized|very outdated)', 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 = None
|
||||||
with open(r'{LogDir}\BleachBit.log'.format(**global_vars), 'r') as f:
|
with open(r'{LogDir}\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:
|
if size is None:
|
||||||
print_warning(size, timestamp=False)
|
print_warning(size, timestamp=False)
|
||||||
else:
|
else:
|
||||||
print_standard(size, timestamp=False)
|
print_standard(size, 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."""
|
||||||
users = get_user_list()
|
users = get_user_list()
|
||||||
users = [u for u in users if u['Active']]
|
users = [u for u in users if u['Active']]
|
||||||
get_user_folder_sizes(users)
|
get_user_folder_sizes(users)
|
||||||
for user in users:
|
for user in users:
|
||||||
print_success('{indent}User: {user}'.format(
|
print_success('{indent}User: {user}'.format(
|
||||||
indent = ' '*int(indent/2),
|
indent = ' '*int(indent/2),
|
||||||
user = user['Name']))
|
user = user['Name']))
|
||||||
for section in ['Profile', None, 'Shell Folders', 'Extra Folders']:
|
for section in ['Profile', None, 'Shell Folders', 'Extra Folders']:
|
||||||
folders = []
|
folders = []
|
||||||
if section is None:
|
if section is None:
|
||||||
# Divider
|
# Divider
|
||||||
print_standard('{}{}'.format(' '*indent, '-'*(width+6)))
|
print_standard('{}{}'.format(' '*indent, '-'*(width+6)))
|
||||||
elif section == 'Profile':
|
elif section == 'Profile':
|
||||||
folders = {'Profile': user['Profile']}
|
folders = {'Profile': user['Profile']}
|
||||||
else:
|
else:
|
||||||
folders = user[section]
|
folders = user[section]
|
||||||
for folder in folders:
|
for folder in folders:
|
||||||
print_standard(
|
print_standard(
|
||||||
'{indent}{folder:<{width}}{size:>6} ({path})'.format(
|
'{indent}{folder:<{width}}{size:>6} ({path})'.format(
|
||||||
indent = ' ' * indent,
|
indent = ' ' * indent,
|
||||||
width = width,
|
width = width,
|
||||||
folder = folder,
|
folder = folder,
|
||||||
size = folders[folder]['Size'],
|
size = folders[folder]['Size'],
|
||||||
path = folders[folder]['Path']))
|
path = folders[folder]['Path']))
|
||||||
|
|
||||||
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.")
|
||||||
|
|
|
||||||
81
.bin/Scripts/functions/network.py
Normal file
81
.bin/Scripts/functions/network.py
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
#!/bin/python3
|
||||||
|
#
|
||||||
|
## Wizard Kit: Functions - Network
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
sys.path.append(os.getcwd())
|
||||||
|
from functions.common import *
|
||||||
|
|
||||||
|
# REGEX
|
||||||
|
REGEX_VALID_IP = re.compile(
|
||||||
|
r'(10.\d+.\d+.\d+'
|
||||||
|
r'|172.(1[6-9]|2\d|3[0-1])'
|
||||||
|
r'|192.168.\d+.\d+)',
|
||||||
|
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
|
||||||
|
|
||||||
|
# LAN
|
||||||
|
if 'en' in net_ifs:
|
||||||
|
# Reload the tg3/broadcom driver (known fix for some Dell systems)
|
||||||
|
try_and_print(message='Reloading drivers...', function=reload_tg3)
|
||||||
|
|
||||||
|
# WiFi
|
||||||
|
if not is_connected() and '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():
|
||||||
|
"""Check for a valid private IP."""
|
||||||
|
devs = psutil.net_if_addrs()
|
||||||
|
for dev in devs.values():
|
||||||
|
for family in dev:
|
||||||
|
if REGEX_VALID_IP.search(family.address):
|
||||||
|
# Valid IP found
|
||||||
|
return True
|
||||||
|
# Else
|
||||||
|
return False
|
||||||
|
|
||||||
|
def show_valid_addresses():
|
||||||
|
devs = psutil.net_if_addrs()
|
||||||
|
for dev, families in sorted(devs.items()):
|
||||||
|
for family in families:
|
||||||
|
if REGEX_VALID_IP.search(family.address):
|
||||||
|
# Valid IP found
|
||||||
|
show_data(message=dev, data=family.address)
|
||||||
|
|
||||||
|
def speedtest():
|
||||||
|
result = run_program(['speedtest-cli', '--simple'])
|
||||||
|
output = [line.strip() for line in result.stdout.decode().splitlines()
|
||||||
|
if line.strip()]
|
||||||
|
output = [line.split() for line in output]
|
||||||
|
output = [(a, float(b), c) for a, b, c in output]
|
||||||
|
return ['{:10}{:6.2f} {}'.format(*line) for line in output]
|
||||||
|
|
||||||
|
def reload_tg3():
|
||||||
|
"""Reload tg3 module as a workaround for some Dell systems."""
|
||||||
|
run_program(['sudo', 'modprobe', '-r', 'tg3'])
|
||||||
|
run_program(['sudo', 'modprobe', 'broadcom'])
|
||||||
|
run_program(['sudo', 'modprobe', 'tg3'])
|
||||||
|
sleep(5)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print("This file is not meant to be called directly.")
|
||||||
|
|
||||||
|
|
@ -1,326 +1,326 @@
|
||||||
# Wizard Kit: Functions - PARTITION UIDs
|
# Wizard Kit: Functions - PARTITION UIDs
|
||||||
# sources: https://en.wikipedia.org/wiki/GUID_Partition_Table
|
# sources: https://en.wikipedia.org/wiki/GUID_Partition_Table
|
||||||
# https://en.wikipedia.org/wiki/Partition_type
|
# https://en.wikipedia.org/wiki/Partition_type
|
||||||
# NOTE: Info has been trimmed for brevity. As such, there may be some inaccuracy.
|
# NOTE: Info has been trimmed for brevity. As such, there may be some inaccuracy.
|
||||||
|
|
||||||
PARTITION_UIDS = {
|
PARTITION_UIDS = {
|
||||||
'00': {'OS': 'All','Description': 'Empty partition entry'},
|
'00': {'OS': 'All','Description': 'Empty partition entry'},
|
||||||
'01': {'OS': 'DOS','Description': 'FAT12 as primary partition'},
|
'01': {'OS': 'DOS','Description': 'FAT12 as primary partition'},
|
||||||
'02': {'OS': 'XENIX','Description': 'XENIX root'},
|
'02': {'OS': 'XENIX','Description': 'XENIX root'},
|
||||||
'03': {'OS': 'XENIX','Description': 'XENIX usr'},
|
'03': {'OS': 'XENIX','Description': 'XENIX usr'},
|
||||||
'04': {'OS': 'DOS','Description': 'FAT16 with less than 32 MB'},
|
'04': {'OS': 'DOS','Description': 'FAT16 with less than 32 MB'},
|
||||||
'05': {'OS': 'DOS / SpeedStor','Description': 'Extended partition'},
|
'05': {'OS': 'DOS / SpeedStor','Description': 'Extended partition'},
|
||||||
'06': {'OS': 'DOS1+','Description': 'FAT16B [over 65K sectors]'},
|
'06': {'OS': 'DOS1+','Description': 'FAT16B [over 65K sectors]'},
|
||||||
'07': {'OS': 'Windows / OS/2 / QNX 2','Description': 'NTFS/exFAT/HPFS/IFS/QNX'},
|
'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'},
|
'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'},
|
'09': {'OS': 'AIX / QNX / Coherent / OS-9','Description': 'AIX/QNZ/Coherent/RBF'},
|
||||||
'0A': {'OS': 'OS/2 / Coherent','Description': 'Boot Manager / Swap'},
|
'0A': {'OS': 'OS/2 / Coherent','Description': 'Boot Manager / Swap'},
|
||||||
'0B': {'OS': 'DOS','Description': 'FAT32 with CHS addressing'},
|
'0B': {'OS': 'DOS','Description': 'FAT32 with CHS addressing'},
|
||||||
'0C': {'OS': 'DOS','Description': 'FAT32 with LBA'},
|
'0C': {'OS': 'DOS','Description': 'FAT32 with LBA'},
|
||||||
'0D': {'OS': 'Silicon Safe','Description': 'Reserved'},
|
'0D': {'OS': 'Silicon Safe','Description': 'Reserved'},
|
||||||
'0E': {'OS': 'DOS','Description': 'FAT16B with LBA'},
|
'0E': {'OS': 'DOS','Description': 'FAT16B with LBA'},
|
||||||
'0F': {'OS': 'DOS','Description': 'Extended partition with LBA'},
|
'0F': {'OS': 'DOS','Description': 'Extended partition with LBA'},
|
||||||
'10': {'OS': 'OPUS','Description': 'Unknown'},
|
'10': {'OS': 'OPUS','Description': 'Unknown'},
|
||||||
'11': {'OS': 'Leading Edge MS-DOS / OS/2','Description': 'FAT12/FAT16'},
|
'11': {'OS': 'Leading Edge MS-DOS / OS/2','Description': 'FAT12/FAT16'},
|
||||||
'12': {'OS': 'Compaq Contura','Description': 'conf/diag/hiber/rescue/serv'},
|
'12': {'OS': 'Compaq Contura','Description': 'conf/diag/hiber/rescue/serv'},
|
||||||
'14': {'OS': 'AST DOS / OS/2 / MaverickOS','Description': 'FAT12/FAT16/Omega'},
|
'14': {'OS': 'AST DOS / OS/2 / MaverickOS','Description': 'FAT12/FAT16/Omega'},
|
||||||
'15': {'OS': 'OS/2 / Maverick OS','Description': 'Hidden extended / Swap'},
|
'15': {'OS': 'OS/2 / Maverick OS','Description': 'Hidden extended / Swap'},
|
||||||
'16': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16B'},
|
'16': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16B'},
|
||||||
'17': {'OS': 'OS/2 Boot Manager','Description': 'Hidden IFS/HPFS/NTFS/exFAT'},
|
'17': {'OS': 'OS/2 Boot Manager','Description': 'Hidden IFS/HPFS/NTFS/exFAT'},
|
||||||
'18': {'OS': 'AST Windows','Description': '0-Volt Suspend/SmartSleep'},
|
'18': {'OS': 'AST Windows','Description': '0-Volt Suspend/SmartSleep'},
|
||||||
'19': {'OS': 'Willowtech Photon coS','Description': 'Willowtech Photon coS'},
|
'19': {'OS': 'Willowtech Photon coS','Description': 'Willowtech Photon coS'},
|
||||||
'1B': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32'},
|
'1B': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32'},
|
||||||
'1C': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32 with LBA'},
|
'1C': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32 with LBA'},
|
||||||
'1E': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16 with LBA'},
|
'1E': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16 with LBA'},
|
||||||
'1F': {'OS': 'OS/2 Boot Manager','Description': 'Hidden extended with LBA'},
|
'1F': {'OS': 'OS/2 Boot Manager','Description': 'Hidden extended with LBA'},
|
||||||
'20': {'OS': 'Windows Mobile','Description': 'update XIP/Willowsoft OFS1'},
|
'20': {'OS': 'Windows Mobile','Description': 'update XIP/Willowsoft OFS1'},
|
||||||
'21': {'OS': 'Oxygen','Description': 'SpeedStor / FSo2'},
|
'21': {'OS': 'Oxygen','Description': 'SpeedStor / FSo2'},
|
||||||
'22': {'OS': 'Oxygen','Description': 'Oxygen Extended Partition'},
|
'22': {'OS': 'Oxygen','Description': 'Oxygen Extended Partition'},
|
||||||
'23': {'OS': 'Windows Mobile','Description': 'Reserved / boot XIP'},
|
'23': {'OS': 'Windows Mobile','Description': 'Reserved / boot XIP'},
|
||||||
'24': {'OS': 'NEC MS-DOS0','Description': 'Logical FAT12 or FAT16'},
|
'24': {'OS': 'NEC MS-DOS0','Description': 'Logical FAT12 or FAT16'},
|
||||||
'25': {'OS': 'Windows Mobile','Description': 'IMGFS[citation needed]'},
|
'25': {'OS': 'Windows Mobile','Description': 'IMGFS[citation needed]'},
|
||||||
'26': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
'26': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||||
'27': {'OS': 'Win/PQserv/MirOS/RooterBOOT','Description': 'WinRE/Rescue/MirOS/RooterBOOT'},
|
'27': {'OS': 'Win/PQserv/MirOS/RooterBOOT','Description': 'WinRE/Rescue/MirOS/RooterBOOT'},
|
||||||
'2A': {'OS': 'AtheOS','Description': 'AthFS/AFS/Reserved'},
|
'2A': {'OS': 'AtheOS','Description': 'AthFS/AFS/Reserved'},
|
||||||
'2B': {'OS': 'SyllableOS','Description': 'SyllableSecure (SylStor)'},
|
'2B': {'OS': 'SyllableOS','Description': 'SyllableSecure (SylStor)'},
|
||||||
'31': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
'31': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||||
'32': {'OS': 'NOS','Description': 'Unknown'},
|
'32': {'OS': 'NOS','Description': 'Unknown'},
|
||||||
'33': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
'33': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||||
'34': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
'34': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||||
'35': {'OS': 'OS/2 Server /eComStation','Description': 'JFS'},
|
'35': {'OS': 'OS/2 Server /eComStation','Description': 'JFS'},
|
||||||
'36': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
'36': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||||
'38': {'OS': 'THEOS','Description': 'THEOS version 3.2, 2 GB'},
|
'38': {'OS': 'THEOS','Description': 'THEOS version 3.2, 2 GB'},
|
||||||
'39': {'OS': 'Plan 9 / THEOS','Description': 'Plan 9 edition 3 / THEOS v4'},
|
'39': {'OS': 'Plan 9 / THEOS','Description': 'Plan 9 edition 3 / THEOS v4'},
|
||||||
'3A': {'OS': 'THEOS','Description': 'THEOS v4, 4 GB'},
|
'3A': {'OS': 'THEOS','Description': 'THEOS v4, 4 GB'},
|
||||||
'3B': {'OS': 'THEOS','Description': 'THEOS v4 extended'},
|
'3B': {'OS': 'THEOS','Description': 'THEOS v4 extended'},
|
||||||
'3C': {'OS': 'PartitionMagic','Description': 'PqRP (image in progress)'},
|
'3C': {'OS': 'PartitionMagic','Description': 'PqRP (image in progress)'},
|
||||||
'3D': {'OS': 'PartitionMagic','Description': 'Hidden NetWare'},
|
'3D': {'OS': 'PartitionMagic','Description': 'Hidden NetWare'},
|
||||||
'3F': {'OS': 'OS/32','Description': 'Unknown'},
|
'3F': {'OS': 'OS/32','Description': 'Unknown'},
|
||||||
'40': {'OS': 'PICK / Venix','Description': 'PICK R83 / Venix 80286'},
|
'40': {'OS': 'PICK / Venix','Description': 'PICK R83 / Venix 80286'},
|
||||||
'41': {'OS': 'RISC / Linux / PowerPC','Description': 'Boot / Old Linux/Minix'},
|
'41': {'OS': 'RISC / Linux / PowerPC','Description': 'Boot / Old Linux/Minix'},
|
||||||
'42': {'OS': 'SFS / Linux / Win2K/XP/etc','Description': 'SFS / Old Linux Swap'},
|
'42': {'OS': 'SFS / Linux / Win2K/XP/etc','Description': 'SFS / Old Linux Swap'},
|
||||||
'43': {'OS': 'Linux','Description': 'Old Linux native'},
|
'43': {'OS': 'Linux','Description': 'Old Linux native'},
|
||||||
'44': {'OS': 'GoBack','Description': 'Norton/WildFire/Adaptec/Roxio'},
|
'44': {'OS': 'GoBack','Description': 'Norton/WildFire/Adaptec/Roxio'},
|
||||||
'45': {'OS': 'Boot-US / EUMEL/ELAN','Description': 'Priam/Boot/EUMEL/ELAN (L2)'},
|
'45': {'OS': 'Boot-US / EUMEL/ELAN','Description': 'Priam/Boot/EUMEL/ELAN (L2)'},
|
||||||
'46': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'},
|
'46': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'},
|
||||||
'47': {'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'},
|
'48': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2), ERGOS L3'},
|
||||||
'4A': {'OS': 'AdaOS / ALFS/THIN','Description': 'Aquila / ALFS/THIN'},
|
'4A': {'OS': 'AdaOS / ALFS/THIN','Description': 'Aquila / ALFS/THIN'},
|
||||||
'4C': {'OS': 'ETH Oberon','Description': 'Aos (A2) file system (76)'},
|
'4C': {'OS': 'ETH Oberon','Description': 'Aos (A2) file system (76)'},
|
||||||
'4D': {'OS': 'QNX Neutrino','Description': 'Primary QNX POSIX volume'},
|
'4D': {'OS': 'QNX Neutrino','Description': 'Primary QNX POSIX volume'},
|
||||||
'4E': {'OS': 'QNX Neutrino','Description': 'Secondary QNX POSIX volume'},
|
'4E': {'OS': 'QNX Neutrino','Description': 'Secondary QNX POSIX volume'},
|
||||||
'4F': {'OS': 'QNX Neutrino / ETH Oberon','Description': '3rd QNX POSIX/Boot/Native'},
|
'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'},
|
'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)'},
|
'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'},
|
'52': {'OS': 'CP/M-80/ System V/AT, V/386','Description': 'CP/M-80'},
|
||||||
'53': {'OS': 'Disk Manager 6','Description': 'Auxiliary 3 (WO)'},
|
'53': {'OS': 'Disk Manager 6','Description': 'Auxiliary 3 (WO)'},
|
||||||
'54': {'OS': 'Disk Manager 6','Description': 'Dynamic Drive Overlay (DDO)'},
|
'54': {'OS': 'Disk Manager 6','Description': 'Dynamic Drive Overlay (DDO)'},
|
||||||
'55': {'OS': 'EZ-Drive','Description': 'Maxtor/MaxBlast/DriveGuide'},
|
'55': {'OS': 'EZ-Drive','Description': 'Maxtor/MaxBlast/DriveGuide'},
|
||||||
'56': {'OS': 'AT&T DOS/EZ-Drive/VFeature','Description': 'FAT12~16/EZ-BIOS/VFeature'},
|
'56': {'OS': 'AT&T DOS/EZ-Drive/VFeature','Description': 'FAT12~16/EZ-BIOS/VFeature'},
|
||||||
'57': {'OS': 'DrivePro','Description': 'VNDI partition'},
|
'57': {'OS': 'DrivePro','Description': 'VNDI partition'},
|
||||||
'5C': {'OS': 'EDISK','Description': 'Priam EDisk Volume'},
|
'5C': {'OS': 'EDISK','Description': 'Priam EDisk Volume'},
|
||||||
'61': {'OS': 'SpeedStor','Description': 'Unknown'},
|
'61': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||||
'63': {'OS': 'Unix','Description': 'Unix,ISC,SysV,ix,BSD,HURD'},
|
'63': {'OS': 'Unix','Description': 'Unix,ISC,SysV,ix,BSD,HURD'},
|
||||||
'64': {'OS': 'SpeedStor / NetWare','Description': 'NetWare FS 286/2,PC-ARMOUR'},
|
'64': {'OS': 'SpeedStor / NetWare','Description': 'NetWare FS 286/2,PC-ARMOUR'},
|
||||||
'65': {'OS': 'NetWare','Description': 'NetWare File System 386'},
|
'65': {'OS': 'NetWare','Description': 'NetWare File System 386'},
|
||||||
'66': {'OS': 'NetWare / NetWare','Description': 'NetWare FS 386 / SMS'},
|
'66': {'OS': 'NetWare / NetWare','Description': 'NetWare FS 386 / SMS'},
|
||||||
'67': {'OS': 'NetWare','Description': 'Wolf Mountain'},
|
'67': {'OS': 'NetWare','Description': 'Wolf Mountain'},
|
||||||
'68': {'OS': 'NetWare','Description': 'Unknown'},
|
'68': {'OS': 'NetWare','Description': 'Unknown'},
|
||||||
'69': {'OS': 'NetWare 5 / NetWare','Description': 'Novell Storage Services'},
|
'69': {'OS': 'NetWare 5 / NetWare','Description': 'Novell Storage Services'},
|
||||||
'6E': {'Description': 'Unknown'},
|
'6E': {'Description': 'Unknown'},
|
||||||
'70': {'OS': 'DiskSecure','Description': 'DiskSecure multiboot'},
|
'70': {'OS': 'DiskSecure','Description': 'DiskSecure multiboot'},
|
||||||
'71': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
'71': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||||
'72': {'OS': 'APTI systems / Unix V7/x86','Description': 'APTI altFAT12 / V7 / x86'},
|
'72': {'OS': 'APTI systems / Unix V7/x86','Description': 'APTI altFAT12 / V7 / x86'},
|
||||||
'73': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
'73': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||||
'74': {'OS': 'Microsoft, IBM','Description': 'Reserved / Scramdisk'},
|
'74': {'OS': 'Microsoft, IBM','Description': 'Reserved / Scramdisk'},
|
||||||
'75': {'OS': 'PC/IX','Description': 'Unknown'},
|
'75': {'OS': 'PC/IX','Description': 'Unknown'},
|
||||||
'76': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
'76': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||||
'77': {'OS': 'Novell','Description': 'VNDI, M2FS, M2CS'},
|
'77': {'OS': 'Novell','Description': 'VNDI, M2FS, M2CS'},
|
||||||
'78': {'OS': 'Geurt Vos','Description': 'XOSL bootloader file system'},
|
'78': {'OS': 'Geurt Vos','Description': 'XOSL bootloader file system'},
|
||||||
'79': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (CHS, SFN)'},
|
'79': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (CHS, SFN)'},
|
||||||
'7A': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (LBA, SFN)'},
|
'7A': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (LBA, SFN)'},
|
||||||
'7B': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16B (CHS, SFN)'},
|
'7B': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16B (CHS, SFN)'},
|
||||||
'7C': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (LBA, SFN)'},
|
'7C': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (LBA, SFN)'},
|
||||||
'7D': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (CHS, SFN)'},
|
'7D': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (CHS, SFN)'},
|
||||||
'7E': {'OS': 'F.I.X. (claim) / PrimoCache','Description': 'Level 2 cache'},
|
'7E': {'OS': 'F.I.X. (claim) / PrimoCache','Description': 'Level 2 cache'},
|
||||||
'7F': {'OS': 'Varies','Description': 'AltOS DevPartition Standard'},
|
'7F': {'OS': 'Varies','Description': 'AltOS DevPartition Standard'},
|
||||||
'80': {'OS': 'Minix 1.1-1.4a','Description': 'Minix file system (old)'},
|
'80': {'OS': 'Minix 1.1-1.4a','Description': 'Minix file system (old)'},
|
||||||
'81': {'OS': 'Minix 1.4b+ / Linux','Description': 'MINIX FS/Mitac AdvDiskManager'},
|
'81': {'OS': 'Minix 1.4b+ / Linux','Description': 'MINIX FS/Mitac AdvDiskManager'},
|
||||||
'82': {'OS': 'Linux / Sun Microsystems','Description': 'Swap / Solaris x86 / Prime'},
|
'82': {'OS': 'Linux / Sun Microsystems','Description': 'Swap / Solaris x86 / Prime'},
|
||||||
'83': {'OS': 'GNU/Linux','Description': 'Any native Linux FS'},
|
'83': {'OS': 'GNU/Linux','Description': 'Any native Linux FS'},
|
||||||
'84': {'OS': 'OS/2 / Windows 7','Description': 'Hibernat/HiddenC/RapidStart'},
|
'84': {'OS': 'OS/2 / Windows 7','Description': 'Hibernat/HiddenC/RapidStart'},
|
||||||
'85': {'OS': 'GNU/Linux','Description': 'Linux extended'},
|
'85': {'OS': 'GNU/Linux','Description': 'Linux extended'},
|
||||||
'86': {'OS': 'Windows NT 4 Server / Linux','Description': 'FAT16B mirror/LinuxRAID-old'},
|
'86': {'OS': 'Windows NT 4 Server / Linux','Description': 'FAT16B mirror/LinuxRAID-old'},
|
||||||
'87': {'OS': 'Windows NT 4 Server','Description': 'HPFS/NTFS mirrored volume'},
|
'87': {'OS': 'Windows NT 4 Server','Description': 'HPFS/NTFS mirrored volume'},
|
||||||
'88': {'OS': 'GNU/Linux','Description': 'Plaintext partition table'},
|
'88': {'OS': 'GNU/Linux','Description': 'Plaintext partition table'},
|
||||||
'8A': {'OS': 'AiR-BOOT','Description': 'Linux kernel image'},
|
'8A': {'OS': 'AiR-BOOT','Description': 'Linux kernel image'},
|
||||||
'8B': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'},
|
'8B': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'},
|
||||||
'8C': {'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'},
|
'8D': {'OS': 'Free FDISK','Description': 'Hidden FAT12'},
|
||||||
'8E': {'OS': 'Linux','Description': 'Linux LVM'},
|
'8E': {'OS': 'Linux','Description': 'Linux LVM'},
|
||||||
'90': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
'90': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
||||||
'91': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
'91': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
||||||
'92': {'OS': 'Free FDISK','Description': 'Hidden FAT16B'},
|
'92': {'OS': 'Free FDISK','Description': 'Hidden FAT16B'},
|
||||||
'93': {'OS': 'Amoeba / Linux','Description': 'Amoeba native/Hidden Linux'},
|
'93': {'OS': 'Amoeba / Linux','Description': 'Amoeba native/Hidden Linux'},
|
||||||
'94': {'OS': 'Amoeba','Description': 'Amoeba bad block table'},
|
'94': {'OS': 'Amoeba','Description': 'Amoeba bad block table'},
|
||||||
'95': {'OS': 'EXOPC','Description': 'EXOPC native'},
|
'95': {'OS': 'EXOPC','Description': 'EXOPC native'},
|
||||||
'96': {'OS': 'CHRP','Description': 'ISO-9660 file system'},
|
'96': {'OS': 'CHRP','Description': 'ISO-9660 file system'},
|
||||||
'97': {'OS': 'Free FDISK','Description': 'Hidden FAT32'},
|
'97': {'OS': 'Free FDISK','Description': 'Hidden FAT32'},
|
||||||
'98': {'OS': 'Free FDISK / ROM-DOS','Description': 'Hidden FAT32 / service part'},
|
'98': {'OS': 'Free FDISK / ROM-DOS','Description': 'Hidden FAT32 / service part'},
|
||||||
'99': {'OS': 'early Unix','Description': 'Unknown'},
|
'99': {'OS': 'early Unix','Description': 'Unknown'},
|
||||||
'9A': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
'9A': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
||||||
'9B': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
'9B': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
||||||
'9E': {'OS': 'VSTA / ForthOS','Description': 'ForthOS (eForth port)'},
|
'9E': {'OS': 'VSTA / ForthOS','Description': 'ForthOS (eForth port)'},
|
||||||
'9F': {'OS': 'BSD/OS 3.0+, BSDI','Description': 'Unknown'},
|
'9F': {'OS': 'BSD/OS 3.0+, BSDI','Description': 'Unknown'},
|
||||||
'A0': {'OS': 'HP/Phoenix/IBM/Toshiba/Sony','Description': 'Diagnostic for HP/Hibernate'},
|
'A0': {'OS': 'HP/Phoenix/IBM/Toshiba/Sony','Description': 'Diagnostic for HP/Hibernate'},
|
||||||
'A1': {'OS': 'HP / Phoenix, NEC','Description': 'HP Vol Expansion/Hibernate'},
|
'A1': {'OS': 'HP / Phoenix, NEC','Description': 'HP Vol Expansion/Hibernate'},
|
||||||
'A2': {'OS': 'Cyclone V','Description': 'Hard Processor System (HPS)'},
|
'A2': {'OS': 'Cyclone V','Description': 'Hard Processor System (HPS)'},
|
||||||
'A3': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
'A3': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||||
'A4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
'A4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||||
'A5': {'OS': 'BSD','Description': 'BSD slice'},
|
'A5': {'OS': 'BSD','Description': 'BSD slice'},
|
||||||
'A6': {'OS': 'OpenBSD','Description': 'HP Vol Expansion/BSD slice'},
|
'A6': {'OS': 'OpenBSD','Description': 'HP Vol Expansion/BSD slice'},
|
||||||
'A7': {'OS': 'NeXT','Description': 'NeXTSTEP'},
|
'A7': {'OS': 'NeXT','Description': 'NeXTSTEP'},
|
||||||
'A8': {'OS': 'Darwin, Mac OS X','Description': 'Apple Darwin, Mac OS X UFS'},
|
'A8': {'OS': 'Darwin, Mac OS X','Description': 'Apple Darwin, Mac OS X UFS'},
|
||||||
'A9': {'OS': 'NetBSD','Description': 'NetBSD slice'},
|
'A9': {'OS': 'NetBSD','Description': 'NetBSD slice'},
|
||||||
'AA': {'OS': 'MS-DOS','Description': 'Olivetti DOS FAT12(1.44 MB)'},
|
'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!'},
|
'AB': {'OS': 'Darwin, Mac OS X / GO! OS','Description': 'Apple Darwin/OS X boot/GO!'},
|
||||||
'AD': {'OS': 'RISC OS','Description': 'ADFS / FileCore format'},
|
'AD': {'OS': 'RISC OS','Description': 'ADFS / FileCore format'},
|
||||||
'AE': {'OS': 'ShagOS','Description': 'ShagOS file system'},
|
'AE': {'OS': 'ShagOS','Description': 'ShagOS file system'},
|
||||||
'AF': {'OS': 'ShagOS','Description': 'OS X HFS & HFS+/ShagOS Swap'},
|
'AF': {'OS': 'ShagOS','Description': 'OS X HFS & HFS+/ShagOS Swap'},
|
||||||
'B0': {'OS': 'Boot-Star','Description': 'Boot-Star dummy partition'},
|
'B0': {'OS': 'Boot-Star','Description': 'Boot-Star dummy partition'},
|
||||||
'B1': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
'B1': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
||||||
'B2': {'OS': 'QNX 6.x','Description': 'QNX Neutrino power-safe FS'},
|
'B2': {'OS': 'QNX 6.x','Description': 'QNX Neutrino power-safe FS'},
|
||||||
'B3': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
'B3': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
||||||
'B4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
'B4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||||
'B6': {'OS': 'Windows NT 4 Server','Description': 'HPVolExpansion/FAT16Bmirror'},
|
'B6': {'OS': 'Windows NT 4 Server','Description': 'HPVolExpansion/FAT16Bmirror'},
|
||||||
'B7': {'OS': 'BSDI / Windows NT 4 Server','Description': 'BSDI,Swap,HPFS/NTFS mirror'},
|
'B7': {'OS': 'BSDI / Windows NT 4 Server','Description': 'BSDI,Swap,HPFS/NTFS mirror'},
|
||||||
'B8': {'OS': 'BSDI (before 3.0)','Description': 'BSDI Swap / native FS'},
|
'B8': {'OS': 'BSDI (before 3.0)','Description': 'BSDI Swap / native FS'},
|
||||||
'BB': {'OS': 'Acronis/BootWizard/WinNT 4','Description': 'BootWizard/OEM/FAT32 mirror'},
|
'BB': {'OS': 'Acronis/BootWizard/WinNT 4','Description': 'BootWizard/OEM/FAT32 mirror'},
|
||||||
'BC': {'OS': 'Acronis/WinNT/BackupCapsule','Description': 'FAT32RAID/SecureZone/Backup'},
|
'BC': {'OS': 'Acronis/WinNT/BackupCapsule','Description': 'FAT32RAID/SecureZone/Backup'},
|
||||||
'BD': {'OS': 'BonnyDOS/286','Description': 'Unknown'},
|
'BD': {'OS': 'BonnyDOS/286','Description': 'Unknown'},
|
||||||
'BE': {'OS': 'Solaris 8','Description': 'Solaris 8 boot'},
|
'BE': {'OS': 'Solaris 8','Description': 'Solaris 8 boot'},
|
||||||
'BF': {'OS': 'Solaris','Description': 'Solaris x86'},
|
'BF': {'OS': 'Solaris','Description': 'Solaris x86'},
|
||||||
'C0': {'OS': 'DR-DOS,MultiuserDOS,REAL/32','Description': 'Secured FAT (under 32 MB)'},
|
'C0': {'OS': 'DR-DOS,MultiuserDOS,REAL/32','Description': 'Secured FAT (under 32 MB)'},
|
||||||
'C1': {'OS': 'DR DOS','Description': 'Secured FAT12'},
|
'C1': {'OS': 'DR DOS','Description': 'Secured FAT12'},
|
||||||
'C2': {'OS': 'Power Boot','Description': 'Hidden Linux native FS'},
|
'C2': {'OS': 'Power Boot','Description': 'Hidden Linux native FS'},
|
||||||
'C3': {'OS': 'Power Boot','Description': 'Hidden Linux Swap'},
|
'C3': {'OS': 'Power Boot','Description': 'Hidden Linux Swap'},
|
||||||
'C4': {'OS': 'DR DOS','Description': 'Secured FAT16'},
|
'C4': {'OS': 'DR DOS','Description': 'Secured FAT16'},
|
||||||
'C5': {'OS': 'DR DOS','Description': 'Secured extended partition'},
|
'C5': {'OS': 'DR DOS','Description': 'Secured extended partition'},
|
||||||
'C6': {'OS': 'DR DOS / WinNT 4 Server','Description': 'Secured FAT16B/FAT16Bmirror'},
|
'C6': {'OS': 'DR DOS / WinNT 4 Server','Description': 'Secured FAT16B/FAT16Bmirror'},
|
||||||
'C7': {'OS': 'Syrinx / WinNT 4 Server','Description': 'Syrinx boot/HPFS/NTFSmirror'},
|
'C7': {'OS': 'Syrinx / WinNT 4 Server','Description': 'Syrinx boot/HPFS/NTFSmirror'},
|
||||||
'C8': {'Description': "DR-DOS Reserved (since '97)"},
|
'C8': {'Description': "DR-DOS Reserved (since '97)"},
|
||||||
'C9': {'Description': "DR-DOS Reserved (since '97)"},
|
'C9': {'Description': "DR-DOS Reserved (since '97)"},
|
||||||
'CA': {'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'},
|
'CB': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'},
|
||||||
'CC': {'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'},
|
'CD': {'OS': 'CTOS','Description': 'Memory dump'},
|
||||||
'CE': {'OS': 'DR-DOSx','Description': 'Secured FAT16B'},
|
'CE': {'OS': 'DR-DOSx','Description': 'Secured FAT16B'},
|
||||||
'CF': {'OS': 'DR-DOSx','Description': 'Secured extended partition'},
|
'CF': {'OS': 'DR-DOSx','Description': 'Secured extended partition'},
|
||||||
'D0': {'OS': 'Multiuser DOS, REAL/32','Description': 'Secured FAT (over 32 MB)'},
|
'D0': {'OS': 'Multiuser DOS, REAL/32','Description': 'Secured FAT (over 32 MB)'},
|
||||||
'D1': {'OS': 'Multiuser DOS','Description': 'Secured FAT12'},
|
'D1': {'OS': 'Multiuser DOS','Description': 'Secured FAT12'},
|
||||||
'D4': {'OS': 'Multiuser DOS','Description': 'Secured FAT16'},
|
'D4': {'OS': 'Multiuser DOS','Description': 'Secured FAT16'},
|
||||||
'D5': {'OS': 'Multiuser DOS','Description': 'Secured extended partition'},
|
'D5': {'OS': 'Multiuser DOS','Description': 'Secured extended partition'},
|
||||||
'D6': {'OS': 'Multiuser DOS','Description': 'Secured FAT16B'},
|
'D6': {'OS': 'Multiuser DOS','Description': 'Secured FAT16B'},
|
||||||
'D8': {'OS': 'Digital Research','Description': 'CP/M-86 [citation needed]'},
|
'D8': {'OS': 'Digital Research','Description': 'CP/M-86 [citation needed]'},
|
||||||
'DA': {'OS': 'Powercopy Backup','Description': 'Non-FS data / Shielded disk'},
|
'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'},
|
'DB': {'OS': 'CP/M-86/CDOS/CTOS/D800/DRMK','Description': 'CP/M-86/ConcDOS/Boot/FAT32'},
|
||||||
'DD': {'OS': 'CTOS','Description': 'Hidden memory dump'},
|
'DD': {'OS': 'CTOS','Description': 'Hidden memory dump'},
|
||||||
'DE': {'OS': 'Dell','Description': 'FAT16 utility/diagnostic'},
|
'DE': {'OS': 'Dell','Description': 'FAT16 utility/diagnostic'},
|
||||||
'DF': {'OS': 'DG/UX / BootIt / Aviion','Description': 'DG/UX Virt DiskMan / EMBRM'},
|
'DF': {'OS': 'DG/UX / BootIt / Aviion','Description': 'DG/UX Virt DiskMan / EMBRM'},
|
||||||
'E0': {'OS': 'STMicroelectronics','Description': 'ST AVFS'},
|
'E0': {'OS': 'STMicroelectronics','Description': 'ST AVFS'},
|
||||||
'E1': {'OS': 'SpeedStor','Description': 'ExtendedFAT12 >1023cylinder'},
|
'E1': {'OS': 'SpeedStor','Description': 'ExtendedFAT12 >1023cylinder'},
|
||||||
'E2': {'Description': 'DOS read-only (XFDISK)'},
|
'E2': {'Description': 'DOS read-only (XFDISK)'},
|
||||||
'E3': {'OS': 'SpeedStor','Description': 'DOS read-only'},
|
'E3': {'OS': 'SpeedStor','Description': 'DOS read-only'},
|
||||||
'E4': {'OS': 'SpeedStor','Description': 'ExtendedFAT16 <1024cylinder'},
|
'E4': {'OS': 'SpeedStor','Description': 'ExtendedFAT16 <1024cylinder'},
|
||||||
'E5': {'OS': 'Tandy MS-DOS','Description': 'Logical FAT12 or FAT16'},
|
'E5': {'OS': 'Tandy MS-DOS','Description': 'Logical FAT12 or FAT16'},
|
||||||
'E6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
'E6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||||
'E8': {'OS': 'LUKS','Description': 'Linux Unified Key Setup'},
|
'E8': {'OS': 'LUKS','Description': 'Linux Unified Key Setup'},
|
||||||
'EB': {'OS': 'BeOS, Haiku','Description': 'BFS'},
|
'EB': {'OS': 'BeOS, Haiku','Description': 'BFS'},
|
||||||
'EC': {'OS': 'SkyOS','Description': 'SkyFS'},
|
'EC': {'OS': 'SkyOS','Description': 'SkyFS'},
|
||||||
'ED': {'OS': 'Sprytix / EDD 4','Description': 'EDC loader / GPT hybrid MBR'},
|
'ED': {'OS': 'Sprytix / EDD 4','Description': 'EDC loader / GPT hybrid MBR'},
|
||||||
'EE': {'OS': 'EFI','Description': 'GPT protective MBR'},
|
'EE': {'OS': 'EFI','Description': 'GPT protective MBR'},
|
||||||
'EF': {'OS': 'EFI','Description': 'EFI system partition'},
|
'EF': {'OS': 'EFI','Description': 'EFI system partition'},
|
||||||
'F0': {'OS': 'Linux / OS/32','Description': 'PA-RISC Linux boot loader.'},
|
'F0': {'OS': 'Linux / OS/32','Description': 'PA-RISC Linux boot loader.'},
|
||||||
'F1': {'OS': 'SpeedStor','Description': 'Unknown'},
|
'F1': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||||
'F2': {'OS': 'SperryIT DOS/Unisys DOS','Description': 'Logical FAT12/FAT16'},
|
'F2': {'OS': 'SperryIT DOS/Unisys DOS','Description': 'Logical FAT12/FAT16'},
|
||||||
'F3': {'OS': 'SpeedStor','Description': 'Unknown'},
|
'F3': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||||
'F4': {'OS': 'SpeedStor / Prologue','Description': '"large"DOS part/NGF/TwinFS'},
|
'F4': {'OS': 'SpeedStor / Prologue','Description': '"large"DOS part/NGF/TwinFS'},
|
||||||
'F5': {'OS': 'Prologue','Description': 'MD0-MD9 part for NGF/TwinFS'},
|
'F5': {'OS': 'Prologue','Description': 'MD0-MD9 part for NGF/TwinFS'},
|
||||||
'F6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
'F6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||||
'F7': {'OS': 'O.S.G. / X1','Description': 'EFAT / Solid State FS'},
|
'F7': {'OS': 'O.S.G. / X1','Description': 'EFAT / Solid State FS'},
|
||||||
'F9': {'OS': 'Linux','Description': 'pCache ext2/ext3 cache'},
|
'F9': {'OS': 'Linux','Description': 'pCache ext2/ext3 cache'},
|
||||||
'FA': {'OS': 'Bochs','Description': 'x86 emulator'},
|
'FA': {'OS': 'Bochs','Description': 'x86 emulator'},
|
||||||
'FB': {'OS': 'VMware','Description': 'VMware VMFS partition'},
|
'FB': {'OS': 'VMware','Description': 'VMware VMFS partition'},
|
||||||
'FC': {'OS': 'VMware','Description': 'Swap / VMKCORE kernel dump'},
|
'FC': {'OS': 'VMware','Description': 'Swap / VMKCORE kernel dump'},
|
||||||
'FD': {'OS': 'Linux / FreeDOS','Description': 'LinuxRAID/Reserved4FreeDOS'},
|
'FD': {'OS': 'Linux / FreeDOS','Description': 'LinuxRAID/Reserved4FreeDOS'},
|
||||||
'FE': {'OS': 'SpeedStor/LANstep/NT/Linux','Description': 'PS/2/DiskAdmin/old LinuxLVM'},
|
'FE': {'OS': 'SpeedStor/LANstep/NT/Linux','Description': 'PS/2/DiskAdmin/old LinuxLVM'},
|
||||||
'FF': {'OS': 'XENIX','Description': 'XENIX bad block table'},
|
'FF': {'OS': 'XENIX','Description': 'XENIX bad block table'},
|
||||||
'00000000-0000-0000-0000-000000000000': {'Description': 'Unused entry'},
|
'00000000-0000-0000-0000-000000000000': {'Description': 'Unused entry'},
|
||||||
'024DEE41-33E7-11D3-9D69-0008C781F39F': {'Description': 'MBR partition scheme'},
|
'024DEE41-33E7-11D3-9D69-0008C781F39F': {'Description': 'MBR partition scheme'},
|
||||||
'C12A7328-F81F-11D2-BA4B-00A0C93EC93B': {'Description': 'EFI System partition'},
|
'C12A7328-F81F-11D2-BA4B-00A0C93EC93B': {'Description': 'EFI System partition'},
|
||||||
'21686148-6449-6E6F-744E-656564454649': {'Description': 'BIOS Boot 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)'},
|
'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'},
|
'F4019732-066E-4E12-8273-346C5641494F': {'Description': 'Sony boot partition'},
|
||||||
'BFBFAFE7-A34F-448A-9A5B-6213EB736C22': {'Description': 'Lenovo boot partition'},
|
'BFBFAFE7-A34F-448A-9A5B-6213EB736C22': {'Description': 'Lenovo boot partition'},
|
||||||
'E3C9E316-0B5C-4DB8-817D-F92DF00215AE': {'OS': 'Windows', 'Description': 'Microsoft Reserved Partition (MSR)'},
|
'E3C9E316-0B5C-4DB8-817D-F92DF00215AE': {'OS': 'Windows', 'Description': 'Microsoft Reserved Partition (MSR)'},
|
||||||
'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7': {'OS': 'Windows', 'Description': 'Basic data partition'},
|
'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'},
|
'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'},
|
'AF9B60A0-1431-4F62-BC68-3311714A69AD': {'OS': 'Windows', 'Description': 'Logical Disk Manager data partition'},
|
||||||
'DE94BBA4-06D1-4D40-A16A-BFD50179D6AC': {'OS': 'Windows', 'Description': 'Windows Recovery Environment'},
|
'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'},
|
'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'},
|
'E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D': {'OS': 'Windows', 'Description': 'Storage Spaces partition'},
|
||||||
'75894C1E-3AEB-11D3-B7C1-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Data partition'},
|
'75894C1E-3AEB-11D3-B7C1-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Data partition'},
|
||||||
'E2A1E728-32E3-11D6-A682-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Service Partition'},
|
'E2A1E728-32E3-11D6-A682-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Service Partition'},
|
||||||
'0FC63DAF-8483-4772-8E79-3D69D8477DE4': {'OS': 'Linux', 'Description': 'Linux filesystem data'},
|
'0FC63DAF-8483-4772-8E79-3D69D8477DE4': {'OS': 'Linux', 'Description': 'Linux filesystem data'},
|
||||||
'A19D880F-05FC-4D3B-A006-743F0F84911E': {'OS': 'Linux', 'Description': 'RAID partition'},
|
'A19D880F-05FC-4D3B-A006-743F0F84911E': {'OS': 'Linux', 'Description': 'RAID partition'},
|
||||||
'44479540-F297-41B2-9AF7-D131D5F0458A': {'OS': 'Linux', 'Description': 'Root partition (x86)'},
|
'44479540-F297-41B2-9AF7-D131D5F0458A': {'OS': 'Linux', 'Description': 'Root partition (x86)'},
|
||||||
'4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709': {'OS': 'Linux', 'Description': 'Root partition (x86-64)'},
|
'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)'},
|
'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)'},
|
'B921B045-1DF0-41C3-AF44-4C6F280D3FAE': {'OS': 'Linux', 'Description': 'Root partition (64-bit ARM)/AArch64)'},
|
||||||
'0657FD6D-A4AB-43C4-84E5-0933C84B4F4F': {'OS': 'Linux', 'Description': 'Swap partition'},
|
'0657FD6D-A4AB-43C4-84E5-0933C84B4F4F': {'OS': 'Linux', 'Description': 'Swap partition'},
|
||||||
'E6D6D379-F507-44C2-A23C-238F2A3DF928': {'OS': 'Linux', 'Description': 'Logical Volume Manager (LVM) partition'},
|
'E6D6D379-F507-44C2-A23C-238F2A3DF928': {'OS': 'Linux', 'Description': 'Logical Volume Manager (LVM) partition'},
|
||||||
'933AC7E1-2EB4-4F13-B844-0E14E2AEF915': {'OS': 'Linux', 'Description': '/home partition'},
|
'933AC7E1-2EB4-4F13-B844-0E14E2AEF915': {'OS': 'Linux', 'Description': '/home partition'},
|
||||||
'3B8F8425-20E0-4F3B-907F-1A25A76F98E8': {'OS': 'Linux', 'Description': '/srv (server data) 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'},
|
'7FFEC5C9-2D00-49B7-8941-3EA10A5586B7': {'OS': 'Linux', 'Description': 'Plain dm-crypt partition'},
|
||||||
'CA7D7CCB-63ED-4C53-861C-1742536059CC': {'OS': 'Linux', 'Description': 'LUKS partition'},
|
'CA7D7CCB-63ED-4C53-861C-1742536059CC': {'OS': 'Linux', 'Description': 'LUKS partition'},
|
||||||
'8DA63339-0007-60C0-C436-083AC8230908': {'OS': 'Linux', 'Description': 'Reserved'},
|
'8DA63339-0007-60C0-C436-083AC8230908': {'OS': 'Linux', 'Description': 'Reserved'},
|
||||||
'83BD6B9D-7F41-11DC-BE0B-001560B84F0F': {'OS': 'FreeBSD', 'Description': 'Boot partition'},
|
'83BD6B9D-7F41-11DC-BE0B-001560B84F0F': {'OS': 'FreeBSD', 'Description': 'Boot partition'},
|
||||||
'516E7CB4-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Data partition'},
|
'516E7CB4-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Data partition'},
|
||||||
'516E7CB5-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Swap partition'},
|
'516E7CB5-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Swap partition'},
|
||||||
'516E7CB6-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Unix File System (UFS) 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'},
|
'516E7CB8-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Vinum volume manager partition'},
|
||||||
'516E7CBA-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'ZFS 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'},
|
'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'},
|
'55465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple UFS'},
|
||||||
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'OS X Darwin', 'Description': 'ZFS'},
|
'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-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'},
|
'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)'},
|
'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'},
|
'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'},
|
'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'},
|
'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'},
|
'6A82CB45-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Boot partition'},
|
||||||
'6A85CF4D-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Root partition'},
|
'6A85CF4D-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Root partition'},
|
||||||
'6A87C46F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Swap partition'},
|
'6A87C46F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Swap partition'},
|
||||||
'6A8B642B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Backup partition'},
|
'6A8B642B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Backup partition'},
|
||||||
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/usr partition'},
|
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/usr partition'},
|
||||||
'6A8EF2E9-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/var partition'},
|
'6A8EF2E9-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/var partition'},
|
||||||
'6A90BA39-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/home partition'},
|
'6A90BA39-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/home partition'},
|
||||||
'6A9283A5-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Alternate sector'},
|
'6A9283A5-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Alternate sector'},
|
||||||
'6A945A3B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Reserved partition'},
|
'6A945A3B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Reserved partition'},
|
||||||
'6A9630D1-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
'6A9630D1-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||||
'6A980767-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
'6A980767-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||||
'6A96237F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
'6A96237F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||||
'6A8D2AC7-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'},
|
'49F48D32-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Swap partition'},
|
||||||
'49F48D5A-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'FFS partition'},
|
'49F48D5A-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'FFS partition'},
|
||||||
'49F48D82-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'LFS partition'},
|
'49F48D82-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'LFS partition'},
|
||||||
'49F48DAA-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'RAID partition'},
|
'49F48DAA-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'RAID partition'},
|
||||||
'2DB519C4-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Concatenated partition'},
|
'2DB519C4-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Concatenated partition'},
|
||||||
'2DB519EC-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Encrypted partition'},
|
'2DB519EC-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Encrypted partition'},
|
||||||
'FE3A2A5D-4F32-41A7-B725-ACCC3285A309': {'OS': 'ChromeOS', 'Description': 'ChromeOS kernel'},
|
'FE3A2A5D-4F32-41A7-B725-ACCC3285A309': {'OS': 'ChromeOS', 'Description': 'ChromeOS kernel'},
|
||||||
'3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC': {'OS': 'ChromeOS', 'Description': 'ChromeOS rootfs'},
|
'3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC': {'OS': 'ChromeOS', 'Description': 'ChromeOS rootfs'},
|
||||||
'2E0A753D-9E48-43B0-8337-B15192CB1B5E': {'OS': 'ChromeOS', 'Description': 'ChromeOS future use'},
|
'2E0A753D-9E48-43B0-8337-B15192CB1B5E': {'OS': 'ChromeOS', 'Description': 'ChromeOS future use'},
|
||||||
'42465331-3BA3-10F1-802A-4861696B7521': {'OS': 'Haiku', 'Description': 'Haiku BFS'},
|
'42465331-3BA3-10F1-802A-4861696B7521': {'OS': 'Haiku', 'Description': 'Haiku BFS'},
|
||||||
'85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Boot partition'},
|
'85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Boot partition'},
|
||||||
'85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Data partition'},
|
'85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Data partition'},
|
||||||
'85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Swap partition'},
|
'85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Swap partition'},
|
||||||
'0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Unix File System (UFS) 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'},
|
'85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Vinum volume manager partition'},
|
||||||
'85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'ZFS 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-B4B80CEFF106': {'OS': 'Ceph', 'Description': 'Ceph Journal'},
|
||||||
'45B0969E-9B03-4F30-B4C6-5EC00CEFF106': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt Encrypted 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-062C0CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph OSD'},
|
||||||
'4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt 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-F3AD0CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph disk in creation'},
|
||||||
'89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt 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'},
|
'824CC7A0-36A8-11E3-890A-952519AD3F61': {'OS': 'OpenBSD', 'Description': 'Data partition'},
|
||||||
'CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1': {'OS': 'QNX', 'Description': 'Power-safe (QNX6) file system'},
|
'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'},
|
'C91818F9-8025-47AF-89D2-F030D7000C2C': {'OS': 'Plan 9', 'Description': 'Plan 9 partition'},
|
||||||
'9D275380-40AD-11DB-BF97-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'vmkcore (coredump 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'},
|
'AA31E02A-400F-11DB-9590-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMFS filesystem partition'},
|
||||||
'9198EFFC-31C0-11DB-8F78-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMware Reserved'},
|
'9198EFFC-31C0-11DB-8F78-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMware Reserved'},
|
||||||
'2568845D-2332-4675-BC39-8FA5A4748D15': {'OS': 'Android-IA', 'Description': 'Bootloader'},
|
'2568845D-2332-4675-BC39-8FA5A4748D15': {'OS': 'Android-IA', 'Description': 'Bootloader'},
|
||||||
'114EAFFE-1552-4022-B26E-9B053604CF84': {'OS': 'Android-IA', 'Description': 'Bootloader2'},
|
'114EAFFE-1552-4022-B26E-9B053604CF84': {'OS': 'Android-IA', 'Description': 'Bootloader2'},
|
||||||
'49A4D17F-93A3-45C1-A0DE-F50B2EBE2599': {'OS': 'Android-IA', 'Description': 'Boot'},
|
'49A4D17F-93A3-45C1-A0DE-F50B2EBE2599': {'OS': 'Android-IA', 'Description': 'Boot'},
|
||||||
'4177C722-9E92-4AAB-8644-43502BFD5506': {'OS': 'Android-IA', 'Description': 'Recovery'},
|
'4177C722-9E92-4AAB-8644-43502BFD5506': {'OS': 'Android-IA', 'Description': 'Recovery'},
|
||||||
'EF32A33B-A409-486C-9141-9FFB711F6266': {'OS': 'Android-IA', 'Description': 'Misc'},
|
'EF32A33B-A409-486C-9141-9FFB711F6266': {'OS': 'Android-IA', 'Description': 'Misc'},
|
||||||
'20AC26BE-20B7-11E3-84C5-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Metadata'},
|
'20AC26BE-20B7-11E3-84C5-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Metadata'},
|
||||||
'38F428E6-D326-425D-9140-6E0EA133647C': {'OS': 'Android-IA', 'Description': 'System'},
|
'38F428E6-D326-425D-9140-6E0EA133647C': {'OS': 'Android-IA', 'Description': 'System'},
|
||||||
'A893EF21-E428-470A-9E55-0668FD91A2D9': {'OS': 'Android-IA', 'Description': 'Cache'},
|
'A893EF21-E428-470A-9E55-0668FD91A2D9': {'OS': 'Android-IA', 'Description': 'Cache'},
|
||||||
'DC76DDA9-5AC1-491C-AF42-A82591580C0D': {'OS': 'Android-IA', 'Description': 'Data'},
|
'DC76DDA9-5AC1-491C-AF42-A82591580C0D': {'OS': 'Android-IA', 'Description': 'Data'},
|
||||||
'EBC597D0-2053-4B15-8B64-E0AAC75F4DB1': {'OS': 'Android-IA', 'Description': 'Persistent'},
|
'EBC597D0-2053-4B15-8B64-E0AAC75F4DB1': {'OS': 'Android-IA', 'Description': 'Persistent'},
|
||||||
'8F68CC74-C5E5-48DA-BE91-A0C8C15E9C80': {'OS': 'Android-IA', 'Description': 'Factory'},
|
'8F68CC74-C5E5-48DA-BE91-A0C8C15E9C80': {'OS': 'Android-IA', 'Description': 'Factory'},
|
||||||
'767941D0-2085-11E3-AD3B-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Fastboot / Tertiary'},
|
'767941D0-2085-11E3-AD3B-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Fastboot / Tertiary'},
|
||||||
'AC6D7924-EB71-4DF8-B48D-E267B27148FF': {'OS': 'Android-IA', 'Description': 'OEM'},
|
'AC6D7924-EB71-4DF8-B48D-E267B27148FF': {'OS': 'Android-IA', 'Description': 'OEM'},
|
||||||
'7412F7D5-A156-4B13-81DC-867174929325': {'OS': 'ONIE', 'Description': 'Boot'},
|
'7412F7D5-A156-4B13-81DC-867174929325': {'OS': 'ONIE', 'Description': 'Boot'},
|
||||||
'D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149': {'OS': 'ONIE', 'Description': 'Config'},
|
'D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149': {'OS': 'ONIE', 'Description': 'Config'},
|
||||||
'9E1A2D38-C612-4316-AA26-8B49521E5A8B': {'OS': 'PowerPC', 'Description': 'PReP boot'},
|
'9E1A2D38-C612-4316-AA26-8B49521E5A8B': {'OS': 'PowerPC', 'Description': 'PReP boot'},
|
||||||
'BC13C2FF-59E6-4262-A352-B275FD6F7172': {'OS': 'Freedesktop', 'Description': 'Extended Boot Partition ($BOOT)'},
|
'BC13C2FF-59E6-4262-A352-B275FD6F7172': {'OS': 'Freedesktop', 'Description': 'Extended Boot Partition ($BOOT)'},
|
||||||
}
|
}
|
||||||
|
|
||||||
def lookup_guid(guid):
|
def lookup_guid(guid):
|
||||||
return PARTITION_UIDS.get(guid.upper(), {})
|
return PARTITION_UIDS.get(guid.upper(), {})
|
||||||
|
|
||||||
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,111 +1,111 @@
|
||||||
# Wizard Kit: Functions - Product Keys
|
# Wizard Kit: Functions - Product Keys
|
||||||
|
|
||||||
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 = {}
|
||||||
|
|
||||||
# Extract keys
|
# Extract keys
|
||||||
extract_item('ProduKey', silent=True)
|
extract_item('ProduKey', silent=True)
|
||||||
for hive in find_software_hives():
|
for hive in find_software_hives():
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['ProduKey'],
|
global_vars['Tools']['ProduKey'],
|
||||||
'/IEKeys', '0',
|
'/IEKeys', '0',
|
||||||
'/WindowsKeys', '1',
|
'/WindowsKeys', '1',
|
||||||
'/OfficeKeys', '1',
|
'/OfficeKeys', '1',
|
||||||
'/ExtractEdition', '1',
|
'/ExtractEdition', '1',
|
||||||
'/nosavereg',
|
'/nosavereg',
|
||||||
'/regfile', hive,
|
'/regfile', hive,
|
||||||
'/scomma', '']
|
'/scomma', '']
|
||||||
try:
|
try:
|
||||||
out = run_program(cmd)
|
out = run_program(cmd)
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
# Ignore and return empty dict
|
# Ignore and return empty dict
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
for line in out.stdout.decode().splitlines():
|
for line in out.stdout.decode().splitlines():
|
||||||
# Add key to keys under product only if unique
|
# Add key to keys under product only if unique
|
||||||
tmp = line.split(',')
|
tmp = line.split(',')
|
||||||
product = tmp[0]
|
product = tmp[0]
|
||||||
key = tmp[2]
|
key = tmp[2]
|
||||||
if product not in keys:
|
if product not in keys:
|
||||||
keys[product] = []
|
keys[product] = []
|
||||||
if key not in keys[product]:
|
if key not in keys[product]:
|
||||||
keys[product].append(key)
|
keys[product].append(key)
|
||||||
|
|
||||||
# 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()
|
||||||
key_list = []
|
key_list = []
|
||||||
if keys:
|
if keys:
|
||||||
for product in sorted(keys):
|
for product in sorted(keys):
|
||||||
key_list.append(product)
|
key_list.append(product)
|
||||||
for key in sorted(keys[product]):
|
for key in sorted(keys[product]):
|
||||||
key_list.append(' {key}'.format(key=key))
|
key_list.append(' {key}'.format(key=key))
|
||||||
else:
|
else:
|
||||||
key_list.append('No keys found.')
|
key_list.append('No keys found.')
|
||||||
|
|
||||||
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 = []
|
||||||
search_paths = [global_vars['ClientDir']]
|
search_paths = [global_vars['ClientDir']]
|
||||||
|
|
||||||
while len(search_paths) > 0:
|
while len(search_paths) > 0:
|
||||||
for item in os.scandir(search_paths.pop(0)):
|
for item in os.scandir(search_paths.pop(0)):
|
||||||
if item.is_dir() and REGEX_REGISTRY_DIRS.search(item.name):
|
if item.is_dir() and REGEX_REGISTRY_DIRS.search(item.name):
|
||||||
search_paths.append(item.path)
|
search_paths.append(item.path)
|
||||||
if item.is_file() and REGEX_SOFTWARE_HIVE.search(item.name):
|
if item.is_file() and REGEX_SOFTWARE_HIVE.search(item.name):
|
||||||
hives.append(item.path)
|
hives.append(item.path)
|
||||||
|
|
||||||
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 = []
|
||||||
log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars)
|
log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars)
|
||||||
with open (log_file, 'r') as f:
|
with open (log_file, 'r') as f:
|
||||||
for line in f.readlines():
|
for line in f.readlines():
|
||||||
if re.search(r'^Product Name', line):
|
if re.search(r'^Product Name', line):
|
||||||
line = re.sub(r'^Product Name\s+:\s+(.*)', r'\1', line.strip())
|
line = re.sub(r'^Product Name\s+:\s+(.*)', r'\1', line.strip())
|
||||||
keys.append(line)
|
keys.append(line)
|
||||||
|
|
||||||
if keys:
|
if keys:
|
||||||
return keys
|
return 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)
|
||||||
log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars)
|
log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars)
|
||||||
if not os.path.exists(log_file):
|
if not os.path.exists(log_file):
|
||||||
# Clear current configuration
|
# Clear current configuration
|
||||||
for config in ['ProduKey.cfg', 'ProduKey64.cfg']:
|
for config in ['ProduKey.cfg', 'ProduKey64.cfg']:
|
||||||
config = r'{BinDir}\ProduKey\{config}'.format(
|
config = r'{BinDir}\ProduKey\{config}'.format(
|
||||||
config=config, **global_vars)
|
config=config, **global_vars)
|
||||||
try:
|
try:
|
||||||
if os.path.exists(config):
|
if os.path.exists(config):
|
||||||
os.remove(config)
|
os.remove(config)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['ProduKey'],
|
global_vars['Tools']['ProduKey'],
|
||||||
'/nosavereg',
|
'/nosavereg',
|
||||||
'/stext',
|
'/stext',
|
||||||
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.")
|
||||||
|
|
|
||||||
|
|
@ -1,126 +1,126 @@
|
||||||
# Wizard Kit: Functions - Repairs
|
# Wizard Kit: Functions - Repairs
|
||||||
|
|
||||||
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:
|
||||||
run_chkdsk_offline()
|
run_chkdsk_offline()
|
||||||
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', '10']:
|
if global_vars['OS']['Version'] in ['8', '10']:
|
||||||
cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE'], '/scan', '/perf']
|
cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE'], '/scan', '/perf']
|
||||||
else:
|
else:
|
||||||
cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE']]
|
cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE']]
|
||||||
out = run_program(cmd, check=False)
|
out = run_program(cmd, check=False)
|
||||||
# retcode == 0: no issues
|
# retcode == 0: no issues
|
||||||
# retcode == 1: fixed issues (also happens when chkdsk.exe is killed?)
|
# retcode == 1: fixed issues (also happens when chkdsk.exe is killed?)
|
||||||
# retcode == 2: issues
|
# retcode == 2: issues
|
||||||
if int(out.returncode) > 0:
|
if int(out.returncode) > 0:
|
||||||
# print_error(' ERROR: CHKDSK encountered errors')
|
# print_error(' ERROR: CHKDSK encountered errors')
|
||||||
raise GenericError
|
raise GenericError
|
||||||
|
|
||||||
# Save stderr
|
# Save stderr
|
||||||
with open(r'{LogDir}\CHKDSK.err'.format(**global_vars), 'a') as f:
|
with open(r'{LogDir}\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}\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 = [
|
||||||
'fsutil', 'dirty',
|
'fsutil', 'dirty',
|
||||||
'set',
|
'set',
|
||||||
global_vars['Env']['SYSTEMDRIVE']]
|
global_vars['Env']['SYSTEMDRIVE']]
|
||||||
out = run_program(cmd, check=False)
|
out = run_program(cmd, check=False)
|
||||||
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 /RestoreHealth, then /CheckHealth, and then report errors."""
|
||||||
if global_vars['OS']['Version'] in ['8', '10']:
|
if global_vars['OS']['Version'] in ['8', '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}\DISM_RestoreHealth.log"'.format(
|
||||||
**global_vars),
|
**global_vars),
|
||||||
'-new_console:n', '-new_console:s33V']
|
'-new_console:n', '-new_console:s33V']
|
||||||
else:
|
else:
|
||||||
# Scan Health
|
# Scan Health
|
||||||
cmd = [
|
cmd = [
|
||||||
'DISM', '/Online',
|
'DISM', '/Online',
|
||||||
'/Cleanup-Image', '/ScanHealth',
|
'/Cleanup-Image', '/ScanHealth',
|
||||||
r'/LogPath:"{LogDir}\DISM_ScanHealth.log"'.format(
|
r'/LogPath:"{LogDir}\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)
|
||||||
wait_for_process('dism')
|
wait_for_process('dism')
|
||||||
# Now check health
|
# Now check health
|
||||||
cmd = [
|
cmd = [
|
||||||
'DISM', '/Online',
|
'DISM', '/Online',
|
||||||
'/Cleanup-Image', '/CheckHealth',
|
'/Cleanup-Image', '/CheckHealth',
|
||||||
r'/LogPath:"{LogDir}\DISM_CheckHealth.log"'.format(**global_vars)]
|
r'/LogPath:"{LogDir}\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():
|
||||||
raise GenericError
|
raise GenericError
|
||||||
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)
|
||||||
os.makedirs(global_vars['QuarantineDir'], exist_ok=True)
|
os.makedirs(global_vars['QuarantineDir'], exist_ok=True)
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['KVRT'],
|
global_vars['Tools']['KVRT'],
|
||||||
'-accepteula', '-dontcryptsupportinfo', '-fixednames',
|
'-accepteula', '-dontcryptsupportinfo', '-fixednames',
|
||||||
'-d', global_vars['QuarantineDir'],
|
'-d', global_vars['QuarantineDir'],
|
||||||
'-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 = [
|
||||||
r'{SYSTEMROOT}\System32\sfc.exe'.format(**global_vars['Env']),
|
r'{SYSTEMROOT}\System32\sfc.exe'.format(**global_vars['Env']),
|
||||||
'/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}\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}\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
|
||||||
log_text = out.stdout.decode('utf-8', 'ignore').replace('\0', '')
|
log_text = out.stdout.decode('utf-8', 'ignore').replace('\0', '')
|
||||||
if re.findall(r'did\s+not\s+find\s+any\s+integrity\s+violations', log_text):
|
if re.findall(r'did\s+not\s+find\s+any\s+integrity\s+violations', log_text):
|
||||||
pass
|
pass
|
||||||
elif re.findall(r'successfully\s+repaired\s+them', log_text):
|
elif re.findall(r'successfully\s+repaired\s+them', log_text):
|
||||||
raise GenericRepair
|
raise GenericRepair
|
||||||
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)
|
||||||
os.makedirs(r'{QuarantineDir}\TDSSKiller'.format(
|
os.makedirs(r'{QuarantineDir}\TDSSKiller'.format(
|
||||||
**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}\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.")
|
||||||
|
|
|
||||||
|
|
@ -1,272 +1,272 @@
|
||||||
# Wizard Kit: Functions - Setup
|
# Wizard Kit: Functions - Setup
|
||||||
|
|
||||||
from functions.common import *
|
from functions.common import *
|
||||||
|
|
||||||
# STATIC VARIABLES
|
# STATIC VARIABLES
|
||||||
HKCU = winreg.HKEY_CURRENT_USER
|
HKCU = winreg.HKEY_CURRENT_USER
|
||||||
HKLM = winreg.HKEY_LOCAL_MACHINE
|
HKLM = winreg.HKEY_LOCAL_MACHINE
|
||||||
SETTINGS_CLASSIC_START = {
|
SETTINGS_CLASSIC_START = {
|
||||||
r'Software\IvoSoft\ClassicShell\Settings': {},
|
r'Software\IvoSoft\ClassicShell\Settings': {},
|
||||||
r'Software\IvoSoft\ClassicStartMenu': {
|
r'Software\IvoSoft\ClassicStartMenu': {
|
||||||
'DWORD Items': {'ShowedStyle2': 1},
|
'DWORD Items': {'ShowedStyle2': 1},
|
||||||
},
|
},
|
||||||
r'Software\IvoSoft\ClassicStartMenu\MRU': {},
|
r'Software\IvoSoft\ClassicStartMenu\MRU': {},
|
||||||
r'Software\IvoSoft\ClassicStartMenu\Settings': {
|
r'Software\IvoSoft\ClassicStartMenu\Settings': {
|
||||||
'DWORD Items': {'SkipMetro': 1},
|
'DWORD Items': {'SkipMetro': 1},
|
||||||
'SZ Items': {
|
'SZ Items': {
|
||||||
'MenuStyle': 'Win7',
|
'MenuStyle': 'Win7',
|
||||||
'RecentPrograms': 'Recent',
|
'RecentPrograms': 'Recent',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
SETTINGS_EXPLORER_SYSTEM = {
|
SETTINGS_EXPLORER_SYSTEM = {
|
||||||
# Disable Telemetry
|
# Disable Telemetry
|
||||||
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
|
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
|
||||||
'DWORD Items': {'AllowTelemetry': 0},
|
'DWORD Items': {'AllowTelemetry': 0},
|
||||||
},
|
},
|
||||||
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
|
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
|
||||||
'DWORD Items': {'AllowTelemetry': 0},
|
'DWORD Items': {'AllowTelemetry': 0},
|
||||||
'WOW64_32': True,
|
'WOW64_32': True,
|
||||||
},
|
},
|
||||||
r'SOFTWARE\Policies\Microsoft\Windows\DataCollection': {
|
r'SOFTWARE\Policies\Microsoft\Windows\DataCollection': {
|
||||||
'DWORD Items': {'AllowTelemetry': 0},
|
'DWORD Items': {'AllowTelemetry': 0},
|
||||||
},
|
},
|
||||||
# Disable Wi-Fi Sense
|
# Disable Wi-Fi Sense
|
||||||
r'Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting': {
|
r'Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting': {
|
||||||
'DWORD Items': {'Value': 0},
|
'DWORD Items': {'Value': 0},
|
||||||
},
|
},
|
||||||
r'Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots': {
|
r'Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots': {
|
||||||
'DWORD Items': {'Value': 0},
|
'DWORD Items': {'Value': 0},
|
||||||
},
|
},
|
||||||
# Disable Location Tracking
|
# Disable Location Tracking
|
||||||
r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}': {
|
r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}': {
|
||||||
'DWORD Items': {'SensorPermissionState': 0},
|
'DWORD Items': {'SensorPermissionState': 0},
|
||||||
},
|
},
|
||||||
r'System\CurrentControlSet\Services\lfsvc\Service\Configuration': {
|
r'System\CurrentControlSet\Services\lfsvc\Service\Configuration': {
|
||||||
'Status': {'Value': 0},
|
'Status': {'Value': 0},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
SETTINGS_EXPLORER_USER = {
|
SETTINGS_EXPLORER_USER = {
|
||||||
# Disable Cortana
|
# Disable Cortana
|
||||||
r'Software\Microsoft\Personalization\Settings': {
|
r'Software\Microsoft\Personalization\Settings': {
|
||||||
'DWORD Items': {'AcceptedPrivacyPolicy': 0},
|
'DWORD Items': {'AcceptedPrivacyPolicy': 0},
|
||||||
},
|
},
|
||||||
r'Software\Microsoft\InputPersonalization': {
|
r'Software\Microsoft\InputPersonalization': {
|
||||||
'DWORD Items': {
|
'DWORD Items': {
|
||||||
'RestrictImplicitTextCollection': 1,
|
'RestrictImplicitTextCollection': 1,
|
||||||
'RestrictImplicitInkCollection': 1
|
'RestrictImplicitInkCollection': 1
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
r'Software\Microsoft\InputPersonalization\TrainedDataStore': {
|
r'Software\Microsoft\InputPersonalization\TrainedDataStore': {
|
||||||
'DWORD Items': {'HarvestContacts': 1},
|
'DWORD Items': {'HarvestContacts': 1},
|
||||||
},
|
},
|
||||||
# Hide Search button / box
|
# Hide Search button / box
|
||||||
r'Software\Microsoft\Windows\CurrentVersion\Search': {
|
r'Software\Microsoft\Windows\CurrentVersion\Search': {
|
||||||
'DWORD Items': {'SearchboxTaskbarMode': 0},
|
'DWORD Items': {'SearchboxTaskbarMode': 0},
|
||||||
},
|
},
|
||||||
# Change default Explorer view to "Computer"
|
# Change default Explorer view to "Computer"
|
||||||
r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced': {
|
r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced': {
|
||||||
'DWORD Items': {'LaunchTo': 1},
|
'DWORD Items': {'LaunchTo': 1},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
SETTINGS_GOOGLE_CHROME = {
|
SETTINGS_GOOGLE_CHROME = {
|
||||||
r'Software\Google\Chrome\Extensions': {
|
r'Software\Google\Chrome\Extensions': {
|
||||||
'WOW64_32': True,
|
'WOW64_32': True,
|
||||||
},
|
},
|
||||||
r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': {
|
r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': {
|
||||||
'SZ Items': {
|
'SZ Items': {
|
||||||
'update_url': 'https://clients2.google.com/service/update2/crx'},
|
'update_url': 'https://clients2.google.com/service/update2/crx'},
|
||||||
'WOW64_32': True,
|
'WOW64_32': True,
|
||||||
},
|
},
|
||||||
r'Software\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco': {
|
r'Software\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco': {
|
||||||
'SZ Items': {
|
'SZ Items': {
|
||||||
'update_url': 'https://clients2.google.com/service/update2/crx'},
|
'update_url': 'https://clients2.google.com/service/update2/crx'},
|
||||||
'WOW64_32': True,
|
'WOW64_32': True,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
VCR_REDISTS = [
|
VCR_REDISTS = [
|
||||||
{'Name': 'Visual C++ 2008 SP1 x32...',
|
{'Name': 'Visual C++ 2008 SP1 x32...',
|
||||||
'Cmd': [r'2008sp1\x32\vcredist.exe', '/qb! /norestart']},
|
'Cmd': [r'2008sp1\x32\vcredist.exe', '/qb! /norestart']},
|
||||||
{'Name': 'Visual C++ 2008 SP1 x64...',
|
{'Name': 'Visual C++ 2008 SP1 x64...',
|
||||||
'Cmd': [r'2008sp1\x64\vcredist.exe', '/qb! /norestart']},
|
'Cmd': [r'2008sp1\x64\vcredist.exe', '/qb! /norestart']},
|
||||||
{'Name': 'Visual C++ 2010 x32...',
|
{'Name': 'Visual C++ 2010 x32...',
|
||||||
'Cmd': [r'2010sp1\x32\vcredist.exe', '/passive', '/norestart']},
|
'Cmd': [r'2010sp1\x32\vcredist.exe', '/passive', '/norestart']},
|
||||||
{'Name': 'Visual C++ 2010 x64...',
|
{'Name': 'Visual C++ 2010 x64...',
|
||||||
'Cmd': [r'2010sp1\x64\vcredist.exe', '/passive', '/norestart']},
|
'Cmd': [r'2010sp1\x64\vcredist.exe', '/passive', '/norestart']},
|
||||||
{'Name': 'Visual C++ 2012 Update 4 x32...',
|
{'Name': 'Visual C++ 2012 Update 4 x32...',
|
||||||
'Cmd': [r'2012u4\x32\vcredist.exe', '/passive', '/norestart']},
|
'Cmd': [r'2012u4\x32\vcredist.exe', '/passive', '/norestart']},
|
||||||
{'Name': 'Visual C++ 2012 Update 4 x64...',
|
{'Name': 'Visual C++ 2012 Update 4 x64...',
|
||||||
'Cmd': [r'2012u4\x64\vcredist.exe', '/passive', '/norestart']},
|
'Cmd': [r'2012u4\x64\vcredist.exe', '/passive', '/norestart']},
|
||||||
{'Name': 'Visual C++ 2013 x32...',
|
{'Name': 'Visual C++ 2013 x32...',
|
||||||
'Cmd': [r'2013\x32\vcredist.exe', '/install',
|
'Cmd': [r'2013\x32\vcredist.exe', '/install',
|
||||||
'/passive', '/norestart']},
|
'/passive', '/norestart']},
|
||||||
{'Name': 'Visual C++ 2013 x64...',
|
{'Name': 'Visual C++ 2013 x64...',
|
||||||
'Cmd': [r'2013\x64\vcredist.exe', '/install',
|
'Cmd': [r'2013\x64\vcredist.exe', '/install',
|
||||||
'/passive', '/norestart']},
|
'/passive', '/norestart']},
|
||||||
{'Name': 'Visual C++ 2017 x32...',
|
{'Name': 'Visual C++ 2017 x32...',
|
||||||
'Cmd': [r'2017\x32\vcredist.exe', '/install',
|
'Cmd': [r'2017\x32\vcredist.exe', '/install',
|
||||||
'/passive', '/norestart']},
|
'/passive', '/norestart']},
|
||||||
{'Name': 'Visual C++ 2017 x64...',
|
{'Name': 'Visual C++ 2017 x64...',
|
||||||
'Cmd': [r'2017\x64\vcredist.exe', '/install',
|
'Cmd': [r'2017\x64\vcredist.exe', '/install',
|
||||||
'/passive', '/norestart']},
|
'/passive', '/norestart']},
|
||||||
]
|
]
|
||||||
|
|
||||||
def config_classicstart():
|
def config_classicstart():
|
||||||
"""Configure ClassicStart."""
|
"""Configure ClassicStart."""
|
||||||
# User level, not system level
|
# User level, not system level
|
||||||
cs_exe = r'{PROGRAMFILES}\Classic Shell\ClassicStartMenu.exe'.format(
|
cs_exe = r'{PROGRAMFILES}\Classic Shell\ClassicStartMenu.exe'.format(
|
||||||
**global_vars['Env'])
|
**global_vars['Env'])
|
||||||
skin = r'{PROGRAMFILES}\Classic Shell\Skins\Metro-Win10-Black.skin7'.format(
|
skin = r'{PROGRAMFILES}\Classic Shell\Skins\Metro-Win10-Black.skin7'.format(
|
||||||
**global_vars['Env'])
|
**global_vars['Env'])
|
||||||
extract_item('ClassicStartSkin', silent=True)
|
extract_item('ClassicStartSkin', silent=True)
|
||||||
|
|
||||||
# Stop Classic Start
|
# Stop Classic Start
|
||||||
run_program([cs_exe, '-exit'], check=False)
|
run_program([cs_exe, '-exit'], check=False)
|
||||||
sleep(1)
|
sleep(1)
|
||||||
kill_process('ClassicStartMenu.exe')
|
kill_process('ClassicStartMenu.exe')
|
||||||
|
|
||||||
# Configure
|
# Configure
|
||||||
write_registry_settings(SETTINGS_CLASSIC_START, all_users=False)
|
write_registry_settings(SETTINGS_CLASSIC_START, all_users=False)
|
||||||
if global_vars['OS']['Version'] == '10' and os.path.exists(skin):
|
if global_vars['OS']['Version'] == '10' and os.path.exists(skin):
|
||||||
# Enable Win10 theme if on Win10
|
# Enable Win10 theme if on Win10
|
||||||
key_path = r'Software\IvoSoft\ClassicStartMenu\Settings'
|
key_path = r'Software\IvoSoft\ClassicStartMenu\Settings'
|
||||||
with winreg.OpenKey(HKCU, key_path, access=winreg.KEY_WRITE) as key:
|
with winreg.OpenKey(HKCU, key_path, access=winreg.KEY_WRITE) as key:
|
||||||
winreg.SetValueEx(
|
winreg.SetValueEx(
|
||||||
key, 'SkinW7', 0, winreg.REG_SZ, 'Metro-Win10-Black')
|
key, 'SkinW7', 0, winreg.REG_SZ, 'Metro-Win10-Black')
|
||||||
winreg.SetValueEx(key, 'SkinVariationW7', 0, winreg.REG_SZ, '')
|
winreg.SetValueEx(key, 'SkinVariationW7', 0, winreg.REG_SZ, '')
|
||||||
|
|
||||||
# Pin Browser to Start Menu (Classic)
|
# Pin Browser to Start Menu (Classic)
|
||||||
firefox = r'{PROGRAMDATA}\Start Menu\Programs\Mozilla Firefox.lnk'.format(
|
firefox = r'{PROGRAMDATA}\Start Menu\Programs\Mozilla Firefox.lnk'.format(
|
||||||
**global_vars['Env'])
|
**global_vars['Env'])
|
||||||
chrome = r'{PROGRAMDATA}\Start Menu\Programs\Google Chrome.lnk'.format(
|
chrome = r'{PROGRAMDATA}\Start Menu\Programs\Google Chrome.lnk'.format(
|
||||||
**global_vars['Env'])
|
**global_vars['Env'])
|
||||||
dest_path = r'{APPDATA}\ClassicShell\Pinned'.format(**global_vars['Env'])
|
dest_path = r'{APPDATA}\ClassicShell\Pinned'.format(**global_vars['Env'])
|
||||||
source = None
|
source = None
|
||||||
dest = None
|
dest = None
|
||||||
if os.path.exists(firefox):
|
if os.path.exists(firefox):
|
||||||
source = firefox
|
source = firefox
|
||||||
dest = r'{}\Mozilla Firefox.lnk'.format(dest_path)
|
dest = r'{}\Mozilla Firefox.lnk'.format(dest_path)
|
||||||
elif os.path.exists(chrome):
|
elif os.path.exists(chrome):
|
||||||
source = chrome
|
source = chrome
|
||||||
dest = r'{}\Google Chrome.lnk'.format(dest_path)
|
dest = r'{}\Google Chrome.lnk'.format(dest_path)
|
||||||
if source:
|
if source:
|
||||||
try:
|
try:
|
||||||
os.makedirs(dest_path, exist_ok=True)
|
os.makedirs(dest_path, exist_ok=True)
|
||||||
shutil.copy(source, dest)
|
shutil.copy(source, dest)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass # Meh, it's fine without
|
pass # Meh, it's fine without
|
||||||
|
|
||||||
# (Re)start Classic Start
|
# (Re)start Classic Start
|
||||||
run_program([cs_exe, '-exit'], check=False)
|
run_program([cs_exe, '-exit'], check=False)
|
||||||
sleep(1)
|
sleep(1)
|
||||||
kill_process('ClassicStartMenu.exe')
|
kill_process('ClassicStartMenu.exe')
|
||||||
sleep(1)
|
sleep(1)
|
||||||
popen_program(cs_exe)
|
popen_program(cs_exe)
|
||||||
|
|
||||||
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
|
||||||
if all_users:
|
if all_users:
|
||||||
hive = HKLM
|
hive = HKLM
|
||||||
for k, v in settings.items():
|
for k, v in settings.items():
|
||||||
# CreateKey
|
# CreateKey
|
||||||
access = winreg.KEY_WRITE
|
access = winreg.KEY_WRITE
|
||||||
if 'WOW64_32' in v:
|
if 'WOW64_32' in v:
|
||||||
access = access | winreg.KEY_WOW64_32KEY
|
access = access | winreg.KEY_WOW64_32KEY
|
||||||
winreg.CreateKeyEx(hive, k, 0, access)
|
winreg.CreateKeyEx(hive, k, 0, access)
|
||||||
|
|
||||||
# Create values
|
# Create values
|
||||||
with winreg.OpenKeyEx(hive, k, 0, access) as key:
|
with winreg.OpenKeyEx(hive, k, 0, access) as key:
|
||||||
for name, value in v.get('DWORD Items', {}).items():
|
for name, value in v.get('DWORD Items', {}).items():
|
||||||
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
|
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
|
||||||
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():
|
def config_explorer_system():
|
||||||
"""Configure Windows Explorer for all users via Registry settings."""
|
"""Configure Windows Explorer for all users via Registry settings."""
|
||||||
write_registry_settings(SETTINGS_EXPLORER_SYSTEM, all_users=True)
|
write_registry_settings(SETTINGS_EXPLORER_SYSTEM, all_users=True)
|
||||||
|
|
||||||
def config_explorer_user():
|
def config_explorer_user():
|
||||||
"""Configure Windows Explorer for current user via Registry settings."""
|
"""Configure Windows Explorer for current user via Registry settings."""
|
||||||
write_registry_settings(SETTINGS_EXPLORER_USER, all_users=False)
|
write_registry_settings(SETTINGS_EXPLORER_USER, all_users=False)
|
||||||
|
|
||||||
def update_clock():
|
def update_clock():
|
||||||
"""Set Timezone and sync clock."""
|
"""Set Timezone and sync clock."""
|
||||||
run_program(['tzutil' ,'/s', TIME_ZONE], check=False)
|
run_program(['tzutil' ,'/s', TIME_ZONE], check=False)
|
||||||
run_program(['net', 'stop', 'w32ime'], check=False)
|
run_program(['net', 'stop', 'w32ime'], check=False)
|
||||||
run_program(
|
run_program(
|
||||||
['w32tm', '/config', '/syncfromflags:manual',
|
['w32tm', '/config', '/syncfromflags:manual',
|
||||||
'/manualpeerlist:"us.pool.ntp.org time.nist.gov time.windows.com"',
|
'/manualpeerlist:"us.pool.ntp.org time.nist.gov time.windows.com"',
|
||||||
],
|
],
|
||||||
check=False)
|
check=False)
|
||||||
run_program(['net', 'start', 'w32ime'], check=False)
|
run_program(['net', 'start', 'w32ime'], check=False)
|
||||||
run_program(['w32tm', '/resync', '/nowait'], check=False)
|
run_program(['w32tm', '/resync', '/nowait'], check=False)
|
||||||
|
|
||||||
# Installations
|
# Installations
|
||||||
def install_adobe_reader():
|
def install_adobe_reader():
|
||||||
"""Install Adobe Reader."""
|
"""Install Adobe Reader."""
|
||||||
cmd = [
|
cmd = [
|
||||||
r'{BaseDir}\Installers\Extras\Office\Adobe Reader DC.exe'.format(
|
r'{BaseDir}\Installers\Extras\Office\Adobe Reader DC.exe'.format(
|
||||||
**global_vars),
|
**global_vars),
|
||||||
'/sAll',
|
'/sAll',
|
||||||
'/msi', '/norestart', '/quiet',
|
'/msi', '/norestart', '/quiet',
|
||||||
'ALLUSERS=1',
|
'ALLUSERS=1',
|
||||||
'EULA_ACCEPT=YES']
|
'EULA_ACCEPT=YES']
|
||||||
try_and_print(message='Adobe Reader DC...', function=run_program, cmd=cmd)
|
try_and_print(message='Adobe Reader DC...', function=run_program, cmd=cmd)
|
||||||
|
|
||||||
def install_chrome_extensions():
|
def install_chrome_extensions():
|
||||||
"""Update registry to 'install' Google Chrome extensions for all users."""
|
"""Update registry to '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', '10']:
|
if global_vars['OS']['Version'] not in ['8', '10']:
|
||||||
raise UnsupportedOSError
|
raise UnsupportedOSError
|
||||||
extract_item('ClassicStartSkin', silent=True)
|
extract_item('ClassicStartSkin', silent=True)
|
||||||
source = r'{BinDir}\ClassicStartSkin\Metro-Win10-Black.skin7'.format(
|
source = r'{BinDir}\ClassicStartSkin\Metro-Win10-Black.skin7'.format(
|
||||||
**global_vars)
|
**global_vars)
|
||||||
dest_path = r'{PROGRAMFILES}\Classic Shell\Skins'.format(
|
dest_path = r'{PROGRAMFILES}\Classic Shell\Skins'.format(
|
||||||
**global_vars['Env'])
|
**global_vars['Env'])
|
||||||
dest = r'{}\Metro-Win10-Black.skin7'.format(dest_path)
|
dest = r'{}\Metro-Win10-Black.skin7'.format(dest_path)
|
||||||
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():
|
||||||
"""Extract Firefox extensions to installation folder."""
|
"""Extract Firefox extensions to installation folder."""
|
||||||
dist_path = r'{PROGRAMFILES}\Mozilla Firefox\distribution\extensions'.format(
|
dist_path = r'{PROGRAMFILES}\Mozilla Firefox\distribution\extensions'.format(
|
||||||
**global_vars['Env'])
|
**global_vars['Env'])
|
||||||
# Extract extension(s) to distribution folder
|
# Extract extension(s) to distribution folder
|
||||||
cmd = [
|
cmd = [
|
||||||
global_vars['Tools']['SevenZip'], 'x', '-aos', '-bso0', '-bse0',
|
global_vars['Tools']['SevenZip'], 'x', '-aos', '-bso0', '-bse0',
|
||||||
'-p{ArchivePassword}'.format(**global_vars),
|
'-p{ArchivePassword}'.format(**global_vars),
|
||||||
'-o{dist_path}'.format(dist_path=dist_path),
|
'-o{dist_path}'.format(dist_path=dist_path),
|
||||||
r'{CBinDir}\FirefoxExtensions.7z'.format(**global_vars)]
|
r'{CBinDir}\FirefoxExtensions.7z'.format(**global_vars)]
|
||||||
run_program(cmd)
|
run_program(cmd)
|
||||||
|
|
||||||
def install_ninite_bundle(mse=False):
|
def install_ninite_bundle(mse=False):
|
||||||
"""Run Ninite file(s) based on OS version."""
|
"""Run Ninite file(s) based on OS version."""
|
||||||
if global_vars['OS']['Version'] in ['8', '10']:
|
if global_vars['OS']['Version'] in ['8', '10']:
|
||||||
# Modern selection
|
# Modern selection
|
||||||
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Modern.exe'.format(
|
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Modern.exe'.format(
|
||||||
**global_vars))
|
**global_vars))
|
||||||
else:
|
else:
|
||||||
# Legacy selection
|
# Legacy selection
|
||||||
if mse:
|
if mse:
|
||||||
cmd = r'{BaseDir}\Installers\Extras\Security'.format(**global_vars)
|
cmd = r'{BaseDir}\Installers\Extras\Security'.format(**global_vars)
|
||||||
cmd += r'\Microsoft Security Essentials.exe'
|
cmd += r'\Microsoft Security Essentials.exe'
|
||||||
popen_program(cmd)
|
popen_program(cmd)
|
||||||
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Legacy.exe'.format(
|
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Legacy.exe'.format(
|
||||||
**global_vars))
|
**global_vars))
|
||||||
|
|
||||||
def install_vcredists():
|
def install_vcredists():
|
||||||
"""Install all supported Visual C++ runtimes."""
|
"""Install all supported Visual C++ runtimes."""
|
||||||
extract_item('_vcredists', silent=True)
|
extract_item('_vcredists', silent=True)
|
||||||
prev_dir = os.getcwd()
|
prev_dir = os.getcwd()
|
||||||
os.chdir(r'{BinDir}\_vcredists'.format(**global_vars))
|
os.chdir(r'{BinDir}\_vcredists'.format(**global_vars))
|
||||||
for vcr in VCR_REDISTS:
|
for vcr in VCR_REDISTS:
|
||||||
try_and_print(message=vcr['Name'], function=run_program, cmd=vcr['Cmd'])
|
try_and_print(message=vcr['Name'], function=run_program, cmd=vcr['Cmd'])
|
||||||
|
|
||||||
os.chdir(prev_dir)
|
os.chdir(prev_dir)
|
||||||
|
|
||||||
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.")
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
43
.bin/Scripts/hw-diags
Executable file
43
.bin/Scripts/hw-diags
Executable file
|
|
@ -0,0 +1,43 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
## Wizard Kit: HW Diagnostics - Menu Launcher
|
||||||
|
|
||||||
|
SESSION_NAME="hw-diags"
|
||||||
|
WINDOW_NAME="Hardware Diagnostics"
|
||||||
|
MENU="hw-diags-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: hw-diags tmux session 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" $*
|
||||||
|
|
||||||
42
.bin/Scripts/hw-diags-audio
Executable file
42
.bin/Scripts/hw-diags-audio
Executable file
|
|
@ -0,0 +1,42 @@
|
||||||
|
#!/bin/python3
|
||||||
|
#
|
||||||
|
## Wizard Kit: HW Diagnostics - Audio
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
sys.path.append(os.getcwd())
|
||||||
|
from functions.common import *
|
||||||
|
init_global_vars()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
# Prep
|
||||||
|
clear_screen()
|
||||||
|
print_standard('Hardware Diagnostics: Audio\n')
|
||||||
|
|
||||||
|
# Set volume
|
||||||
|
try:
|
||||||
|
run_program('amixer -q set "Master" 80% unmute'.split())
|
||||||
|
run_program('amixer -q set "PCM" 90% unmute'.split())
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print_error('Failed to set volume')
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
for mode in ['pink', 'wav']:
|
||||||
|
run_program(
|
||||||
|
cmd = 'speaker-test -c 2 -l 1 -t {}'.format(mode).split(),
|
||||||
|
check = False,
|
||||||
|
pipe = False)
|
||||||
|
|
||||||
|
# Done
|
||||||
|
#print_standard('\nDone.')
|
||||||
|
#pause("Press Enter to exit...")
|
||||||
|
exit_script()
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
except:
|
||||||
|
major_exception()
|
||||||
|
|
||||||
18
.bin/Scripts/hw-diags-badblocks
Executable file
18
.bin/Scripts/hw-diags-badblocks
Executable file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/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"
|
||||||
|
|
||||||
30
.bin/Scripts/hw-diags-menu
Executable file
30
.bin/Scripts/hw-diags-menu
Executable file
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/python3
|
||||||
|
#
|
||||||
|
## Wizard Kit: HW Diagnostics - Menu
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# 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()
|
||||||
|
|
||||||
|
# Show menu
|
||||||
|
menu_diags(*sys.argv)
|
||||||
|
|
||||||
|
# Done
|
||||||
|
#print_standard('\nDone.')
|
||||||
|
#pause("Press Enter to exit...")
|
||||||
|
exit_script()
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
except:
|
||||||
|
major_exception()
|
||||||
|
|
||||||
46
.bin/Scripts/hw-diags-network
Executable file
46
.bin/Scripts/hw-diags-network
Executable file
|
|
@ -0,0 +1,46 @@
|
||||||
|
#!/bin/python3
|
||||||
|
#
|
||||||
|
## Wizard Kit: HW Diagnostics - Network
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
sys.path.append(os.getcwd())
|
||||||
|
from functions.network import *
|
||||||
|
|
||||||
|
def check_connection():
|
||||||
|
if not is_connected():
|
||||||
|
# Raise to cause NS in try_and_print()
|
||||||
|
raise Exception
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
# Prep
|
||||||
|
clear_screen()
|
||||||
|
print_standard('Hardware Diagnostics: Network\n')
|
||||||
|
|
||||||
|
# Connect
|
||||||
|
print_standard('Initializing...')
|
||||||
|
connect_to_network()
|
||||||
|
|
||||||
|
# Tests
|
||||||
|
try_and_print(
|
||||||
|
message='Network connection:', function=check_connection, cs='OK')
|
||||||
|
show_valid_addresses()
|
||||||
|
try_and_print(message='Internet connection:', function=ping,
|
||||||
|
addr='8.8.8.8', cs='OK')
|
||||||
|
try_and_print(message='DNS Resolution:', function=ping, cs='OK')
|
||||||
|
try_and_print(message='Speedtest:', function=speedtest,
|
||||||
|
print_return=True)
|
||||||
|
|
||||||
|
# Done
|
||||||
|
print_standard('\nDone.')
|
||||||
|
#pause("Press Enter to exit...")
|
||||||
|
exit_script()
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
except:
|
||||||
|
major_exception()
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
## HW diagnostics - Prime95
|
## Wizard Kit: HW Diagnostics - Prime95
|
||||||
|
|
||||||
function usage {
|
function usage {
|
||||||
echo "Usage: $0 log-dir"
|
echo "Usage: $0 log-dir"
|
||||||
|
|
@ -15,3 +15,4 @@ fi
|
||||||
|
|
||||||
# Run Prime95
|
# Run Prime95
|
||||||
mprime -t | grep -iv --line-buffered 'stress.txt' | tee -a "$1/prime.log"
|
mprime -t | grep -iv --line-buffered 'stress.txt' | tee -a "$1/prime.log"
|
||||||
|
|
||||||
164
.bin/Scripts/hw-sensors
Executable file
164
.bin/Scripts/hw-sensors
Executable file
|
|
@ -0,0 +1,164 @@
|
||||||
|
#!/bin/python3
|
||||||
|
#
|
||||||
|
## Wizard Kit: Sensor monitoring tool
|
||||||
|
|
||||||
|
import itertools
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
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.INTRUSION:
|
||||||
|
vals = [sensors.get_value(chip, sf.number) for sf in sfs]
|
||||||
|
# short path for INTRUSION to demonstrate type usage
|
||||||
|
status = "alarm" if int(vals[0]) == 1 else "normal"
|
||||||
|
print_standard(' {:18} {}'.format(label, status))
|
||||||
|
return
|
||||||
|
|
||||||
|
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_temps[chip_name] = [chip_name]
|
||||||
|
for feature in sensors.FeatureIterator(chip):
|
||||||
|
chip_temps[chip_name].append(get_feature_string(chip, feature))
|
||||||
|
chip_temps[chip_name].append('')
|
||||||
|
|
||||||
|
# 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()
|
||||||
|
|
||||||
|
|
@ -1,60 +1,60 @@
|
||||||
# Wizard Kit: Install the standard SW bundle based on the OS version
|
# Wizard Kit: Install the standard SW bundle based on the OS version
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
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)
|
global_vars['LogFile'] = r'{LogDir}\Install SW Bundle.log'.format(**global_vars)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: SW Bundle Tool\n'.format(KIT_NAME_FULL))
|
print_info('{}: SW Bundle Tool\n'.format(KIT_NAME_FULL))
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
'CalledProcessError': 'Unknown Error',
|
'CalledProcessError': 'Unknown Error',
|
||||||
},
|
},
|
||||||
'Warning': {
|
'Warning': {
|
||||||
'GenericRepair': 'Repaired',
|
'GenericRepair': 'Repaired',
|
||||||
'UnsupportedOSError': 'Unsupported OS',
|
'UnsupportedOSError': 'Unsupported OS',
|
||||||
}}
|
}}
|
||||||
answer_extensions = ask('Install Extensions?')
|
answer_extensions = ask('Install Extensions?')
|
||||||
answer_adobe_reader = ask('Install Adobe Reader?')
|
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']:
|
||||||
# Vista is dead, not going to check for it
|
# Vista is dead, not going to check for it
|
||||||
answer_mse = ask('Install MSE?')
|
answer_mse = ask('Install MSE?')
|
||||||
else:
|
else:
|
||||||
answer_mse = False
|
answer_mse = False
|
||||||
|
|
||||||
print_info('Installing Programs')
|
print_info('Installing Programs')
|
||||||
if answer_adobe_reader:
|
if answer_adobe_reader:
|
||||||
install_adobe_reader()
|
install_adobe_reader()
|
||||||
if answer_vcr:
|
if answer_vcr:
|
||||||
install_vcredists()
|
install_vcredists()
|
||||||
if answer_ninite:
|
if answer_ninite:
|
||||||
try_and_print(message='Ninite bundle...',
|
try_and_print(message='Ninite bundle...',
|
||||||
function=install_ninite_bundle, cs='Started', mse=answer_mse)
|
function=install_ninite_bundle, cs='Started', mse=answer_mse)
|
||||||
if answer_extensions:
|
if answer_extensions:
|
||||||
wait_for_process('ninite.exe')
|
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,
|
||||||
other_results=other_results)
|
other_results=other_results)
|
||||||
try_and_print(message='Google Chrome extensions...',
|
try_and_print(message='Google Chrome extensions...',
|
||||||
function=install_chrome_extensions)
|
function=install_chrome_extensions)
|
||||||
try_and_print(message='Mozilla Firefox extensions...',
|
try_and_print(message='Mozilla Firefox extensions...',
|
||||||
function=install_firefox_extensions)
|
function=install_firefox_extensions)
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,34 @@
|
||||||
# Wizard Kit: Install Visual C++ Runtimes
|
# Wizard Kit: Install Visual C++ Runtimes
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
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)
|
global_vars['LogFile'] = r'{LogDir}\Install Visual C++ Runtimes.log'.format(**global_vars)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: Install Visual C++ Runtimes\n'.format(KIT_NAME_FULL))
|
print_info('{}: Install Visual C++ Runtimes\n'.format(KIT_NAME_FULL))
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
'CalledProcessError': 'Unknown Error',
|
'CalledProcessError': 'Unknown Error',
|
||||||
}}
|
}}
|
||||||
|
|
||||||
if ask('Install Visual C++ Runtimes?'):
|
if ask('Install Visual C++ Runtimes?'):
|
||||||
install_vcredists()
|
install_vcredists()
|
||||||
else:
|
else:
|
||||||
abort()
|
abort()
|
||||||
|
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
38
.bin/Scripts/mount-all-volumes
Executable file
38
.bin/Scripts/mount-all-volumes
Executable file
|
|
@ -0,0 +1,38 @@
|
||||||
|
#!/bin/python3
|
||||||
|
#
|
||||||
|
## Wizard Kit: Volume mount tool
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
sys.path.append(os.getcwd())
|
||||||
|
from functions.data import *
|
||||||
|
init_global_vars()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
# Prep
|
||||||
|
clear_screen()
|
||||||
|
print_standard('{}: Volume mount tool'.format(KIT_NAME_FULL))
|
||||||
|
|
||||||
|
# Mount volumes
|
||||||
|
report = mount_all_volumes()
|
||||||
|
|
||||||
|
# Print report
|
||||||
|
print_info('\nResults')
|
||||||
|
for line in report:
|
||||||
|
show_data(indent=4, width=16, **line[-1])
|
||||||
|
|
||||||
|
# Done
|
||||||
|
print_standard('\nDone.')
|
||||||
|
if 'gui' in sys.argv:
|
||||||
|
pause("Press Enter to exit...")
|
||||||
|
popen_program(['nohup', 'thunar', '/media'])
|
||||||
|
exit_script()
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
except:
|
||||||
|
major_exception()
|
||||||
|
|
||||||
38
.bin/Scripts/mount-backup-shares
Executable file
38
.bin/Scripts/mount-backup-shares
Executable file
|
|
@ -0,0 +1,38 @@
|
||||||
|
#!/bin/python3
|
||||||
|
#
|
||||||
|
## Wizard Kit: Backup share mount tool
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
sys.path.append(os.getcwd())
|
||||||
|
from functions.data import *
|
||||||
|
from functions.network import *
|
||||||
|
init_global_vars()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
# Prep
|
||||||
|
clear_screen()
|
||||||
|
|
||||||
|
# Connect
|
||||||
|
connect_to_network()
|
||||||
|
|
||||||
|
# Mount
|
||||||
|
if is_connected():
|
||||||
|
mount_backup_shares()
|
||||||
|
else:
|
||||||
|
# Couldn't connect
|
||||||
|
print_error('ERROR: No network connectivity.')
|
||||||
|
|
||||||
|
# Done
|
||||||
|
print_standard('\nDone.')
|
||||||
|
#pause("Press Enter to exit...")
|
||||||
|
exit_script()
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
except:
|
||||||
|
major_exception()
|
||||||
|
|
||||||
81
.bin/Scripts/msword-search
Executable file
81
.bin/Scripts/msword-search
Executable file
|
|
@ -0,0 +1,81 @@
|
||||||
|
#!/bin/python3
|
||||||
|
#
|
||||||
|
## Wizard Kit: MS Word content search tool
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# STATIC VARIABLES
|
||||||
|
SCANDIR = os.getcwd()
|
||||||
|
USAGE = '''Usage: {script} <search-terms>...
|
||||||
|
e.g. {script} "Book Title" "Keyword" "etc"
|
||||||
|
|
||||||
|
This script will search all doc/docx files below the current directory for
|
||||||
|
the search-terms provided (case-insensitive).'''.format(script=__file__)
|
||||||
|
|
||||||
|
# Init
|
||||||
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
sys.path.append(os.getcwd())
|
||||||
|
from functions.network import *
|
||||||
|
init_global_vars()
|
||||||
|
|
||||||
|
REGEX_DOC_FILES = re.compile(r'\.docx?$', re.IGNORECASE)
|
||||||
|
|
||||||
|
def scan_for_docs(path):
|
||||||
|
for entry in os.scandir(path):
|
||||||
|
if entry.is_dir(follow_symlinks=False):
|
||||||
|
yield from scantree(entry.path)
|
||||||
|
elif entry.is_file and REGEX_DOC_FILES.search(entry.name):
|
||||||
|
yield entry
|
||||||
|
|
||||||
|
def scan_file(file_path, search):
|
||||||
|
match = False
|
||||||
|
try:
|
||||||
|
if entry.name.lower().endswith('.docx'):
|
||||||
|
result = run_program(['unzip', '-p', entry.path])
|
||||||
|
else:
|
||||||
|
# Assuming .doc
|
||||||
|
result = run_program(['antiword', entry.path])
|
||||||
|
out = result.stdout.decode()
|
||||||
|
match = re.search(search, out, re.IGNORECASE)
|
||||||
|
except Exception:
|
||||||
|
# Ignore errors since files may be corrupted
|
||||||
|
pass
|
||||||
|
|
||||||
|
return entry.path if match else None
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
# Prep
|
||||||
|
clear_screen()
|
||||||
|
terms = [re.sub(r'\s+', r'\s*', t) for t in sys.argv[1:]]
|
||||||
|
search = '({})'.format('|'.join(terms))
|
||||||
|
|
||||||
|
if len(sys.argv) == 1:
|
||||||
|
# Print usage
|
||||||
|
print_standard(USAGE)
|
||||||
|
else:
|
||||||
|
matches = []
|
||||||
|
for entry in scan_for_docs(SCANDIR):
|
||||||
|
matches.append(scan_file(entry.path, search))
|
||||||
|
# Strip None values (i.e. non-matching entries)
|
||||||
|
matches = [m for m in matches if m]
|
||||||
|
if matches:
|
||||||
|
print_success('Found {} {}:'.format(
|
||||||
|
len(matches),
|
||||||
|
'Matches' if len(matches) > 1 else 'Match'))
|
||||||
|
for match in matches:
|
||||||
|
print_standard(match)
|
||||||
|
else:
|
||||||
|
print_error('No matches found.')
|
||||||
|
|
||||||
|
# Done
|
||||||
|
print_standard('\nDone.')
|
||||||
|
#pause("Press Enter to exit...")
|
||||||
|
exit_script()
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
except:
|
||||||
|
major_exception()
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
## Remount volume read-write
|
## Wizard Kit: Volume remount tool
|
||||||
|
|
||||||
if ! mount | grep -q "$1"; then
|
if ! mount | grep -q "$1"; then
|
||||||
echo "ERROR: Can't remount $1"
|
echo "ERROR: Can't remount $1"
|
||||||
|
|
@ -10,6 +10,7 @@ fi
|
||||||
|
|
||||||
DEVICE=$(mount | grep "$1" | cut -d' ' -f1)
|
DEVICE=$(mount | grep "$1" | cut -d' ' -f1)
|
||||||
|
|
||||||
|
# Remount read-write
|
||||||
echo "Remounting: $DEVICE"
|
echo "Remounting: $DEVICE"
|
||||||
udevil umount $DEVICE
|
udevil umount $DEVICE
|
||||||
if udevil mount $DEVICE; then
|
if udevil mount $DEVICE; then
|
||||||
|
|
@ -1,44 +1,44 @@
|
||||||
# Wizard Kit: Enter SafeMode by editing the BCD
|
# Wizard Kit: Enter SafeMode by editing the BCD
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# STATIC VARIABLES
|
# STATIC VARIABLES
|
||||||
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
sys.path.append(os.getcwd())
|
||||||
from functions.common import *
|
from functions.common 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))
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: SafeMode Tool\n'.format(KIT_NAME_FULL))
|
print_info('{}: SafeMode Tool\n'.format(KIT_NAME_FULL))
|
||||||
if not ask('Enable booting to SafeMode (with Networking)?'):
|
if not ask('Enable booting to SafeMode (with Networking)?'):
|
||||||
abort()
|
abort()
|
||||||
|
|
||||||
# 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, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
# Enable MSI access under safemode
|
# Enable MSI access under safemode
|
||||||
cmd = ['reg', 'add', REG_MSISERVER, '/f']
|
cmd = ['reg', 'add', REG_MSISERVER, '/f']
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
cmd = ['reg', 'add', REG_MSISERVER, '/ve',
|
cmd = ['reg', 'add', REG_MSISERVER, '/ve',
|
||||||
'/t', 'REG_SZ', '/d', 'Service', '/f']
|
'/t', 'REG_SZ', '/d', 'Service', '/f']
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
## Done ##
|
## Done ##
|
||||||
pause('Press Enter to reboot...')
|
pause('Press Enter to reboot...')
|
||||||
cmd = ['shutdown', '-r', '-t', '3']
|
cmd = ['shutdown', '-r', '-t', '3']
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,42 @@
|
||||||
# Wizard Kit: Exit SafeMode by editing the BCD
|
# Wizard Kit: Exit SafeMode by editing the BCD
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# STATIC VARIABLES
|
# STATIC VARIABLES
|
||||||
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
sys.path.append(os.getcwd())
|
||||||
from functions.common import *
|
from functions.common 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))
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: SafeMode Tool\n'.format(KIT_NAME_FULL))
|
print_info('{}: SafeMode Tool\n'.format(KIT_NAME_FULL))
|
||||||
if not ask('Disable booting to SafeMode?'):
|
if not ask('Disable booting to SafeMode?'):
|
||||||
abort()
|
abort()
|
||||||
|
|
||||||
# Edit BCD to remove safeboot value
|
# Edit BCD to remove safeboot value
|
||||||
for boot in ['{current}', '{default}']:
|
for boot in ['{current}', '{default}']:
|
||||||
cmd = ['bcdedit', '/deletevalue', boot, 'safeboot']
|
cmd = ['bcdedit', '/deletevalue', boot, 'safeboot']
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
# 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, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
## Done ##
|
## Done ##
|
||||||
pause('Press Enter to reboot...')
|
pause('Press Enter to reboot...')
|
||||||
cmd = ['shutdown', '-r', '-t', '3']
|
cmd = ['shutdown', '-r', '-t', '3']
|
||||||
run_program(cmd, check=False)
|
run_program(cmd, check=False)
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,70 +1,70 @@
|
||||||
# Wizard Kit: Settings - Music
|
# Wizard Kit: Settings - Music
|
||||||
|
|
||||||
MUSIC_MOD = [
|
MUSIC_MOD = [
|
||||||
'104208#banana_boat.mod',
|
'104208#banana_boat.mod',
|
||||||
'114971#tilbury_fair.mod',
|
'114971#tilbury_fair.mod',
|
||||||
'132563#ufo_tune.mod',
|
'132563#ufo_tune.mod',
|
||||||
'135906#magnetik_girl.xm',
|
'135906#magnetik_girl.xm',
|
||||||
'140628#autumn_in_budapest.xm',
|
'140628#autumn_in_budapest.xm',
|
||||||
'143198#summer_memories_3.xm',
|
'143198#summer_memories_3.xm',
|
||||||
'144405#hillbilly_billyboy.xm',
|
'144405#hillbilly_billyboy.xm',
|
||||||
'154795#4mat_-_eternity.xm',
|
'154795#4mat_-_eternity.xm',
|
||||||
'155845#bookworm.mo3',
|
'155845#bookworm.mo3',
|
||||||
'155914#battleofsteel.xm',
|
'155914#battleofsteel.xm',
|
||||||
'158975#1_channel_moog.it',
|
'158975#1_channel_moog.it',
|
||||||
'165495#trans.s3m',
|
'165495#trans.s3m',
|
||||||
'168513#necros_-_introspection.s3m',
|
'168513#necros_-_introspection.s3m',
|
||||||
'169628#radix_-_feng_shui_schematics.xm',
|
'169628#radix_-_feng_shui_schematics.xm',
|
||||||
'175238#unknown48_-_twilight.mod',
|
'175238#unknown48_-_twilight.mod',
|
||||||
'33432#ambrozia.xm',
|
'33432#ambrozia.xm',
|
||||||
'33460#amigatre.mod',
|
'33460#amigatre.mod',
|
||||||
'34594#CHARIOT.S3M',
|
'34594#CHARIOT.S3M',
|
||||||
'34596#BUTTERFL.XM',
|
'34596#BUTTERFL.XM',
|
||||||
'34654#CTGOBLIN.S3M',
|
'34654#CTGOBLIN.S3M',
|
||||||
'35151#bananasplit.mod',
|
'35151#bananasplit.mod',
|
||||||
'35280#DEADLOCK.XM',
|
'35280#DEADLOCK.XM',
|
||||||
'38591#compo_liam.xm',
|
'38591#compo_liam.xm',
|
||||||
'39987#crystald.s3m',
|
'39987#crystald.s3m',
|
||||||
'40475#ELYSIUM.MOD',
|
'40475#ELYSIUM.MOD',
|
||||||
'42146#enigma.mod',
|
'42146#enigma.mod',
|
||||||
'42519#GHOST2.MOD',
|
'42519#GHOST2.MOD',
|
||||||
'42560#GSLINGER.MOD',
|
'42560#GSLINGER.MOD',
|
||||||
'42872#existing.xm',
|
'42872#existing.xm',
|
||||||
'50427#nf-stven.xm',
|
'50427#nf-stven.xm',
|
||||||
'51549#overture.mod',
|
'51549#overture.mod',
|
||||||
'54250#SATELL.S3M',
|
'54250#SATELL.S3M',
|
||||||
'54313#realmk.s3m',
|
'54313#realmk.s3m',
|
||||||
'55789#scrambld.mod',
|
'55789#scrambld.mod',
|
||||||
'57934#spacedeb.mod',
|
'57934#spacedeb.mod',
|
||||||
'59344#stardstm.mod',
|
'59344#stardstm.mod',
|
||||||
'60395#2ND_PM.S3M',
|
'60395#2ND_PM.S3M',
|
||||||
'66187#external.xm',
|
'66187#external.xm',
|
||||||
'66343#beek-substitutionology.it',
|
'66343#beek-substitutionology.it',
|
||||||
'67561#radix-unreal_superhero.xm',
|
'67561#radix-unreal_superhero.xm',
|
||||||
'70829#inside_out.s3m',
|
'70829#inside_out.s3m',
|
||||||
'83779#beyond_music.mod',
|
'83779#beyond_music.mod',
|
||||||
]
|
]
|
||||||
|
|
||||||
MUSIC_SNES = [
|
MUSIC_SNES = [
|
||||||
'actr',
|
'actr',
|
||||||
'crock',
|
'crock',
|
||||||
'ct',
|
'ct',
|
||||||
'dkc',
|
'dkc',
|
||||||
'dkq',
|
'dkq',
|
||||||
'ff6',
|
'ff6',
|
||||||
'fz',
|
'fz',
|
||||||
'loz3',
|
'loz3',
|
||||||
'mmx',
|
'mmx',
|
||||||
'ptws',
|
'ptws',
|
||||||
'scv4',
|
'scv4',
|
||||||
'sf',
|
'sf',
|
||||||
'sf2',
|
'sf2',
|
||||||
'sgng',
|
'sgng',
|
||||||
'smk',
|
'smk',
|
||||||
'smw',
|
'smw',
|
||||||
'yi',
|
'yi',
|
||||||
'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.")
|
||||||
|
|
|
||||||
|
|
@ -1,203 +1,203 @@
|
||||||
# Wizard Kit: Settings - Sources
|
# Wizard Kit: Settings - Sources
|
||||||
|
|
||||||
SOURCE_URLS = {
|
SOURCE_URLS = {
|
||||||
'AIDA64': 'http://download.aida64.com/aida64engineer595.zip',
|
'AIDA64': 'http://download.aida64.com/aida64engineer595.zip',
|
||||||
'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1800920044/AcroRdrDC1800920044_en_US.exe',
|
'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1800920044/AcroRdrDC1800920044_en_US.exe',
|
||||||
'AdwCleaner': 'https://toolslib.net/downloads/finish/1-adwcleaner/',
|
'AdwCleaner': 'https://toolslib.net/downloads/finish/1-adwcleaner/',
|
||||||
'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip',
|
'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip',
|
||||||
'BleachBit': 'https://download.bleachbit.org/beta/1.17/BleachBit-1.17-portable.zip',
|
'BleachBit': 'https://download.bleachbit.org/beta/1.17/BleachBit-1.17-portable.zip',
|
||||||
'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip',
|
'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip',
|
||||||
'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip',
|
'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip',
|
||||||
'Caffeine': 'http://www.zhornsoftware.co.uk/caffeine/caffeine.zip',
|
'Caffeine': 'http://www.zhornsoftware.co.uk/caffeine/caffeine.zip',
|
||||||
'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.877.x86.zip',
|
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.877.x86.zip',
|
||||||
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.877.x64.zip',
|
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.877.x64.zip',
|
||||||
'FastCopy32': 'http://ftp.vector.co.jp/69/28/2323/FastCopy332.zip',
|
'FastCopy32': 'http://ftp.vector.co.jp/69/28/2323/FastCopy332.zip',
|
||||||
'FastCopy64': 'http://ftp.vector.co.jp/69/28/2323/FastCopy332_x64.zip',
|
'FastCopy64': 'http://ftp.vector.co.jp/69/28/2323/FastCopy332_x64.zip',
|
||||||
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/764482/ublock_origin-1.14.18-an+fx.xpi?src=dp-btn-primary',
|
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/764482/ublock_origin-1.14.18-an+fx.xpi?src=dp-btn-primary',
|
||||||
'HWiNFO32': 'http://app.oldfoss.com:81/download/HWiNFO/hw32_560.zip',
|
'HWiNFO32': 'http://app.oldfoss.com:81/download/HWiNFO/hw32_560.zip',
|
||||||
'HWiNFO64': 'http://app.oldfoss.com:81/download/HWiNFO/hw64_560.zip',
|
'HWiNFO64': 'http://app.oldfoss.com:81/download/HWiNFO/hw64_560.zip',
|
||||||
'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',
|
||||||
'IOBit_Uninstaller': 'https://portableapps.com/redirect/?a=IObitUninstallerPortable&t=http%3A%2F%2Fdownloads.portableapps.com%2Fportableapps%2Fiobituninstallerportable%2FIObitUninstallerPortable_7.0.2.49.paf.exe',
|
'IOBit_Uninstaller': 'https://portableapps.com/redirect/?a=IObitUninstallerPortable&t=http%3A%2F%2Fdownloads.portableapps.com%2Fportableapps%2Fiobituninstallerportable%2FIObitUninstallerPortable_7.0.2.49.paf.exe',
|
||||||
'Intel SSD Toolbox': r'https://downloadmirror.intel.com/27330/eng/Intel%20SSD%20Toolbox%20-%20v3.4.9.exe',
|
'Intel SSD Toolbox': r'https://downloadmirror.intel.com/27330/eng/Intel%20SSD%20Toolbox%20-%20v3.4.9.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.2/npp.7.5.2.bin.minimalist.7z',
|
'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.5.2/npp.7.5.2.bin.minimalist.7z',
|
||||||
'Office Deployment Tool 2013': 'https://download.microsoft.com/download/6/2/3/6230F7A2-D8A9-478B-AC5C-57091B632FCF/officedeploymenttool_x86_4827-1000.exe',
|
'Office Deployment Tool 2013': 'https://download.microsoft.com/download/6/2/3/6230F7A2-D8A9-478B-AC5C-57091B632FCF/officedeploymenttool_x86_4827-1000.exe',
|
||||||
'Office Deployment Tool 2016': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_8529.3600.exe',
|
'Office Deployment Tool 2016': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_8529.3600.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/',
|
||||||
'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',
|
||||||
'Samsung Magician': 'http://downloadcenter.samsung.com/content/SW/201710/20171019164455812/Samsung_Magician_Installer.exe',
|
'Samsung Magician': 'http://downloadcenter.samsung.com/content/SW/201710/20171019164455812/Samsung_Magician_Installer.exe',
|
||||||
'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',
|
||||||
'TreeSizeFree': 'https://www.jam-software.com/treesize_free/TreeSizeFree-Portable.zip',
|
'TreeSizeFree': 'https://www.jam-software.com/treesize_free/TreeSizeFree-Portable.zip',
|
||||||
'wimlib32': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip',
|
'wimlib32': 'https://wimlib.net/downloads/wimlib-1.12.0-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.12.0-windows-x86_64-bin.zip',
|
||||||
'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip',
|
'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip',
|
||||||
'XMPlay 7z': 'http://support.xmplay.com/files/16/xmp-7z.zip?v=800962',
|
'XMPlay 7z': 'http://support.xmplay.com/files/16/xmp-7z.zip?v=800962',
|
||||||
'XMPlay Game': 'http://support.xmplay.com/files/12/xmp-gme.zip?v=515637',
|
'XMPlay Game': 'http://support.xmplay.com/files/12/xmp-gme.zip?v=515637',
|
||||||
'XMPlay RAR': 'http://support.xmplay.com/files/16/xmp-rar.zip?v=409646',
|
'XMPlay RAR': 'http://support.xmplay.com/files/16/xmp-rar.zip?v=409646',
|
||||||
'XMPlay WAModern': 'http://support.xmplay.com/files/10/WAModern.zip?v=207099',
|
'XMPlay WAModern': 'http://support.xmplay.com/files/10/WAModern.zip?v=207099',
|
||||||
'XMPlay': 'http://support.xmplay.com/files/20/xmplay3823.zip?v=115916',
|
'XMPlay': 'http://support.xmplay.com/files/20/xmplay3823.zip?v=115916',
|
||||||
'XYplorerFree': 'https://www.xyplorer.com/download/xyplorer_free_noinstall.zip',
|
'XYplorerFree': 'https://www.xyplorer.com/download/xyplorer_free_noinstall.zip',
|
||||||
'aria2': 'https://github.com/aria2/aria2/releases/download/release-1.33.1/aria2-1.33.1-win-32bit-build1.zip',
|
'aria2': 'https://github.com/aria2/aria2/releases/download/release-1.33.1/aria2-1.33.1-win-32bit-build1.zip',
|
||||||
}
|
}
|
||||||
VCREDIST_SOURCES = {
|
VCREDIST_SOURCES = {
|
||||||
'2008sp1': {
|
'2008sp1': {
|
||||||
'32': 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe',
|
'32': 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe',
|
||||||
'64': 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe',
|
'64': 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe',
|
||||||
},
|
},
|
||||||
'2010sp1': {
|
'2010sp1': {
|
||||||
'32': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe',
|
'32': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe',
|
||||||
'64': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe',
|
'64': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe',
|
||||||
},
|
},
|
||||||
'2012u4': {
|
'2012u4': {
|
||||||
'32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe',
|
'32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe',
|
||||||
'64': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe',
|
'64': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe',
|
||||||
},
|
},
|
||||||
'2013': {
|
'2013': {
|
||||||
'32': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x86.exe',
|
'32': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x86.exe',
|
||||||
'64': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x64.exe',
|
'64': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x64.exe',
|
||||||
},
|
},
|
||||||
'2017': {
|
'2017': {
|
||||||
'32': 'https://download.visualstudio.microsoft.com/download/pr/11100229/78c1e864d806e36f6035d80a0e80399e/VC_redist.x86.exe',
|
'32': 'https://download.visualstudio.microsoft.com/download/pr/11100229/78c1e864d806e36f6035d80a0e80399e/VC_redist.x86.exe',
|
||||||
'64': 'https://download.visualstudio.microsoft.com/download/pr/11100230/15ccb3f02745c7b206ad10373cbca89b/VC_redist.x64.exe',
|
'64': 'https://download.visualstudio.microsoft.com/download/pr/11100230/15ccb3f02745c7b206ad10373cbca89b/VC_redist.x64.exe',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
NINITE_SOURCES = {
|
NINITE_SOURCES = {
|
||||||
'Bundles': {
|
'Bundles': {
|
||||||
'Runtimes.exe': '.net4.7-air-java8-silverlight',
|
'Runtimes.exe': '.net4.7-air-java8-silverlight',
|
||||||
'Legacy.exe': '.net4.7-7zip-air-chrome-firefox-java8-silverlight-vlc',
|
'Legacy.exe': '.net4.7-7zip-air-chrome-firefox-java8-silverlight-vlc',
|
||||||
'Modern.exe': '.net4.7-7zip-air-chrome-classicstart-firefox-java8-silverlight-vlc',
|
'Modern.exe': '.net4.7-7zip-air-chrome-classicstart-firefox-java8-silverlight-vlc',
|
||||||
},
|
},
|
||||||
'Audio-Video': {
|
'Audio-Video': {
|
||||||
'AIMP.exe': 'aimp',
|
'AIMP.exe': 'aimp',
|
||||||
'Audacity.exe': 'audacity',
|
'Audacity.exe': 'audacity',
|
||||||
'CCCP.exe': 'cccp',
|
'CCCP.exe': 'cccp',
|
||||||
'Foobar2000.exe': 'foobar',
|
'Foobar2000.exe': 'foobar',
|
||||||
'GOM.exe': 'gom',
|
'GOM.exe': 'gom',
|
||||||
'HandBrake.exe': 'handbrake',
|
'HandBrake.exe': 'handbrake',
|
||||||
'iTunes.exe': 'itunes',
|
'iTunes.exe': 'itunes',
|
||||||
'K-Lite Codecs.exe': 'klitecodecs',
|
'K-Lite Codecs.exe': 'klitecodecs',
|
||||||
'MediaMonkey.exe': 'mediamonkey',
|
'MediaMonkey.exe': 'mediamonkey',
|
||||||
'MusicBee.exe': 'musicbee',
|
'MusicBee.exe': 'musicbee',
|
||||||
'Spotify.exe': 'spotify',
|
'Spotify.exe': 'spotify',
|
||||||
'VLC.exe': 'vlc',
|
'VLC.exe': 'vlc',
|
||||||
'Winamp.exe': 'winamp',
|
'Winamp.exe': 'winamp',
|
||||||
},
|
},
|
||||||
'Cloud Storage': {
|
'Cloud Storage': {
|
||||||
'Dropbox.exe': 'dropbox',
|
'Dropbox.exe': 'dropbox',
|
||||||
'Google Backup & Sync.exe': 'googlebackupandsync',
|
'Google Backup & Sync.exe': 'googlebackupandsync',
|
||||||
'Mozy.exe': 'mozy',
|
'Mozy.exe': 'mozy',
|
||||||
'OneDrive.exe': 'onedrive',
|
'OneDrive.exe': 'onedrive',
|
||||||
'SugarSync.exe': 'sugarsync',
|
'SugarSync.exe': 'sugarsync',
|
||||||
},
|
},
|
||||||
'Communication': {
|
'Communication': {
|
||||||
'Pidgin.exe': 'pidgin',
|
'Pidgin.exe': 'pidgin',
|
||||||
'Skype.exe': 'skype',
|
'Skype.exe': 'skype',
|
||||||
'Trillian.exe': 'trillian',
|
'Trillian.exe': 'trillian',
|
||||||
},
|
},
|
||||||
'Compression': {
|
'Compression': {
|
||||||
'7-Zip.exe': '7zip',
|
'7-Zip.exe': '7zip',
|
||||||
'PeaZip.exe': 'peazip',
|
'PeaZip.exe': 'peazip',
|
||||||
'WinRAR.exe': 'winrar',
|
'WinRAR.exe': 'winrar',
|
||||||
},
|
},
|
||||||
'Developer': {
|
'Developer': {
|
||||||
'Eclipse.exe': 'eclipse',
|
'Eclipse.exe': 'eclipse',
|
||||||
'FileZilla.exe': 'filezilla',
|
'FileZilla.exe': 'filezilla',
|
||||||
'JDK 8.exe': 'jdk8',
|
'JDK 8.exe': 'jdk8',
|
||||||
'JDK 8 (x64).exe': 'jdkx8',
|
'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',
|
||||||
'Visual Studio Code.exe': 'vscode',
|
'Visual Studio Code.exe': 'vscode',
|
||||||
'WinMerge.exe': 'winmerge',
|
'WinMerge.exe': 'winmerge',
|
||||||
'WinSCP.exe': 'winscp',
|
'WinSCP.exe': 'winscp',
|
||||||
},
|
},
|
||||||
'File Sharing': {
|
'File Sharing': {
|
||||||
'qBittorrent.exe': 'qbittorrent',
|
'qBittorrent.exe': 'qbittorrent',
|
||||||
},
|
},
|
||||||
'Image-Photo': {
|
'Image-Photo': {
|
||||||
'Blender.exe': 'blender',
|
'Blender.exe': 'blender',
|
||||||
'FastStone.exe': 'faststone',
|
'FastStone.exe': 'faststone',
|
||||||
'GIMP.exe': 'gimp',
|
'GIMP.exe': 'gimp',
|
||||||
'Greenshot.exe': 'greenshot',
|
'Greenshot.exe': 'greenshot',
|
||||||
'Inkscape.exe': 'inkscape',
|
'Inkscape.exe': 'inkscape',
|
||||||
'IrfanView.exe': 'irfanview',
|
'IrfanView.exe': 'irfanview',
|
||||||
'Krita.exe': 'krita',
|
'Krita.exe': 'krita',
|
||||||
'Paint.NET.exe': 'paint.net',
|
'Paint.NET.exe': 'paint.net',
|
||||||
'ShareX.exe': 'sharex',
|
'ShareX.exe': 'sharex',
|
||||||
'XnView.exe': 'xnview',
|
'XnView.exe': 'xnview',
|
||||||
},
|
},
|
||||||
'Misc': {
|
'Misc': {
|
||||||
'Evernote.exe': 'evernote',
|
'Evernote.exe': 'evernote',
|
||||||
'Everything.exe': 'everything',
|
'Everything.exe': 'everything',
|
||||||
'KeePass 2.exe': 'keepass2',
|
'KeePass 2.exe': 'keepass2',
|
||||||
'Google Earth.exe': 'googleearth',
|
'Google Earth.exe': 'googleearth',
|
||||||
'NV Access.exe': 'nvda',
|
'NV Access.exe': 'nvda',
|
||||||
'Steam.exe': 'steam',
|
'Steam.exe': 'steam',
|
||||||
},
|
},
|
||||||
'Office': {
|
'Office': {
|
||||||
'CutePDF.exe': 'cutepdf',
|
'CutePDF.exe': 'cutepdf',
|
||||||
'Foxit Reader.exe': 'foxit',
|
'Foxit Reader.exe': 'foxit',
|
||||||
'LibreOffice.exe': 'libreoffice',
|
'LibreOffice.exe': 'libreoffice',
|
||||||
'OpenOffice.exe': 'openoffice',
|
'OpenOffice.exe': 'openoffice',
|
||||||
'PDFCreator.exe': 'pdfcreator',
|
'PDFCreator.exe': 'pdfcreator',
|
||||||
'SumatraPDF.exe': 'sumatrapdf',
|
'SumatraPDF.exe': 'sumatrapdf',
|
||||||
'Thunderbird.exe': 'thunderbird',
|
'Thunderbird.exe': 'thunderbird',
|
||||||
},
|
},
|
||||||
'Runtimes': {
|
'Runtimes': {
|
||||||
'Adobe Air.exe': 'air',
|
'Adobe Air.exe': 'air',
|
||||||
'dotNET.exe': '.net4.7',
|
'dotNET.exe': '.net4.7',
|
||||||
'Java 8.exe': 'java8',
|
'Java 8.exe': 'java8',
|
||||||
'Shockwave.exe': 'shockwave',
|
'Shockwave.exe': 'shockwave',
|
||||||
'Silverlight.exe': 'silverlight',
|
'Silverlight.exe': 'silverlight',
|
||||||
},
|
},
|
||||||
'Security': {
|
'Security': {
|
||||||
'Avast.exe': 'avast',
|
'Avast.exe': 'avast',
|
||||||
'AVG.exe': 'avg',
|
'AVG.exe': 'avg',
|
||||||
'Avira.exe': 'avira',
|
'Avira.exe': 'avira',
|
||||||
'Microsoft Security Essentials.exe': 'essentials',
|
'Microsoft Security Essentials.exe': 'essentials',
|
||||||
'Malwarebytes Anti-Malware.exe': 'malwarebytes',
|
'Malwarebytes Anti-Malware.exe': 'malwarebytes',
|
||||||
'Spybot 2.exe': 'spybot2',
|
'Spybot 2.exe': 'spybot2',
|
||||||
'SUPERAntiSpyware.exe': 'super',
|
'SUPERAntiSpyware.exe': 'super',
|
||||||
},
|
},
|
||||||
'Utilities': {
|
'Utilities': {
|
||||||
'CDBurnerXP.exe': 'cdburnerxp',
|
'CDBurnerXP.exe': 'cdburnerxp',
|
||||||
'Classic Start.exe': 'classicstart',
|
'Classic Start.exe': 'classicstart',
|
||||||
'Glary Utilities.exe': 'glary',
|
'Glary Utilities.exe': 'glary',
|
||||||
'ImgBurn.exe': 'imgburn',
|
'ImgBurn.exe': 'imgburn',
|
||||||
'InfraRecorder.exe': 'infrarecorder',
|
'InfraRecorder.exe': 'infrarecorder',
|
||||||
'Launchy.exe': 'launchy',
|
'Launchy.exe': 'launchy',
|
||||||
'RealVNC.exe': 'realvnc',
|
'RealVNC.exe': 'realvnc',
|
||||||
'Revo Uninstaller.exe': 'revo',
|
'Revo Uninstaller.exe': 'revo',
|
||||||
'TeamViewer 12.exe': 'teamviewer12',
|
'TeamViewer 12.exe': 'teamviewer12',
|
||||||
'TeraCopy.exe': 'teracopy',
|
'TeraCopy.exe': 'teracopy',
|
||||||
'WinDirStat.exe': 'windirstat',
|
'WinDirStat.exe': 'windirstat',
|
||||||
},
|
},
|
||||||
'Web Browsers': {
|
'Web Browsers': {
|
||||||
'Google Chrome.exe': 'chrome',
|
'Google Chrome.exe': 'chrome',
|
||||||
'Mozilla Firefox.exe': 'firefox',
|
'Mozilla Firefox.exe': 'firefox',
|
||||||
'Opera Chromium.exe': 'operaChromium',
|
'Opera Chromium.exe': 'operaChromium',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
RST_SOURCES = {
|
RST_SOURCES = {
|
||||||
#SetupRST_12.0.exe : Removed from download center?
|
#SetupRST_12.0.exe : Removed from download center?
|
||||||
#SetupRST_12.5.exe : Removed from download center?
|
#SetupRST_12.5.exe : Removed from download center?
|
||||||
#SetupRST_12.8.exe : Removed from download center?
|
#SetupRST_12.8.exe : Removed from download center?
|
||||||
'SetupRST_12.9.exe': 'https://downloadmirror.intel.com/23496/eng/SetupRST.exe',
|
'SetupRST_12.9.exe': 'https://downloadmirror.intel.com/23496/eng/SetupRST.exe',
|
||||||
#SetupRST_13.x.exe : Broken, doesn't support > .NET 4.5
|
#SetupRST_13.x.exe : Broken, doesn't support > .NET 4.5
|
||||||
'SetupRST_14.0.exe': 'https://downloadmirror.intel.com/25091/eng/SetupRST.exe',
|
'SetupRST_14.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/27147/eng/SetupRST.exe',
|
'SetupRST_15.8.exe': 'https://downloadmirror.intel.com/27147/eng/SetupRST.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.")
|
||||||
|
|
|
||||||
|
|
@ -1,55 +1,55 @@
|
||||||
# Wizard Kit: Settings - Tools
|
# Wizard Kit: Settings - Tools
|
||||||
|
|
||||||
TOOLS = {
|
TOOLS = {
|
||||||
# NOTE: BinDir will be prepended to these paths at runtime
|
# NOTE: BinDir will be prepended to these paths at runtime
|
||||||
'AIDA64': {
|
'AIDA64': {
|
||||||
'32': r'AIDA64\aida64.exe'},
|
'32': r'AIDA64\aida64.exe'},
|
||||||
'AutoRuns': {
|
'AutoRuns': {
|
||||||
'32': r'Autoruns\autoruns.exe',
|
'32': r'Autoruns\autoruns.exe',
|
||||||
'64': r'Autoruns\autoruns64.exe'},
|
'64': r'Autoruns\autoruns64.exe'},
|
||||||
'BleachBit': {
|
'BleachBit': {
|
||||||
'32': r'BleachBit\bleachbit_console.exe'},
|
'32': r'BleachBit\bleachbit_console.exe'},
|
||||||
'Caffeine': {
|
'Caffeine': {
|
||||||
'32': r'Caffeine\caffeine.exe'},
|
'32': r'Caffeine\caffeine.exe'},
|
||||||
'Du': {
|
'Du': {
|
||||||
'32': r'Du\du.exe',
|
'32': r'Du\du.exe',
|
||||||
'64': r'Du\du64.exe'},
|
'64': r'Du\du64.exe'},
|
||||||
'ERUNT': {
|
'ERUNT': {
|
||||||
'32': r'ERUNT\ERUNT.EXE'},
|
'32': r'ERUNT\ERUNT.EXE'},
|
||||||
'Everything': {
|
'Everything': {
|
||||||
'32': r'Everything\Everything.exe',
|
'32': r'Everything\Everything.exe',
|
||||||
'64': r'Everything\Everything64.exe'},
|
'64': r'Everything\Everything64.exe'},
|
||||||
'FastCopy': {
|
'FastCopy': {
|
||||||
'32': r'FastCopy\FastCopy.exe',
|
'32': r'FastCopy\FastCopy.exe',
|
||||||
'64': r'FastCopy\FastCopy64.exe'},
|
'64': r'FastCopy\FastCopy64.exe'},
|
||||||
'HitmanPro': {
|
'HitmanPro': {
|
||||||
'32': r'HitmanPro\HitmanPro.exe',
|
'32': r'HitmanPro\HitmanPro.exe',
|
||||||
'64': r'HitmanPro\HitmanPro64.exe'},
|
'64': r'HitmanPro\HitmanPro64.exe'},
|
||||||
'HWiNFO': {
|
'HWiNFO': {
|
||||||
'32': r'HWiNFO\HWiNFO.exe',
|
'32': r'HWiNFO\HWiNFO.exe',
|
||||||
'64': r'HWiNFO\HWiNFO64.exe'},
|
'64': r'HWiNFO\HWiNFO64.exe'},
|
||||||
'KVRT': {
|
'KVRT': {
|
||||||
'32': r'KVRT\KVRT.exe'},
|
'32': r'KVRT\KVRT.exe'},
|
||||||
'NotepadPlusPlus': {
|
'NotepadPlusPlus': {
|
||||||
'32': r'NotepadPlusPlus\notepadplusplus.exe'},
|
'32': r'NotepadPlusPlus\notepadplusplus.exe'},
|
||||||
'ProduKey': {
|
'ProduKey': {
|
||||||
'32': r'ProduKey\ProduKey.exe',
|
'32': r'ProduKey\ProduKey.exe',
|
||||||
'64': r'ProduKey\ProduKey64.exe'},
|
'64': r'ProduKey\ProduKey64.exe'},
|
||||||
'PuTTY-PSFTP': {
|
'PuTTY-PSFTP': {
|
||||||
'32': r'PuTTY\PSFTP.EXE'},
|
'32': r'PuTTY\PSFTP.EXE'},
|
||||||
'RKill': {
|
'RKill': {
|
||||||
'32': r'RKill\RKill.exe'},
|
'32': r'RKill\RKill.exe'},
|
||||||
'SevenZip': {
|
'SevenZip': {
|
||||||
'32': r'7-Zip\7za.exe',
|
'32': r'7-Zip\7za.exe',
|
||||||
'64': r'7-Zip\7za64.exe'},
|
'64': r'7-Zip\7za64.exe'},
|
||||||
'TDSSKiller': {
|
'TDSSKiller': {
|
||||||
'32': r'TDSSKiller\TDSSKiller.exe'},
|
'32': r'TDSSKiller\TDSSKiller.exe'},
|
||||||
'wimlib-imagex': {
|
'wimlib-imagex': {
|
||||||
'32': r'wimlib\x32\wimlib-imagex.exe',
|
'32': r'wimlib\x32\wimlib-imagex.exe',
|
||||||
'64': r'wimlib\x64\wimlib-imagex.exe'},
|
'64': r'wimlib\x64\wimlib-imagex.exe'},
|
||||||
'XMPlay': {
|
'XMPlay': {
|
||||||
'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.")
|
||||||
|
|
|
||||||
|
|
@ -1,39 +1,39 @@
|
||||||
# Wizard Kit: Check, and possibly repair, system file health via SFC
|
# Wizard Kit: Check, and possibly repair, system file health via SFC
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
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)
|
global_vars['LogFile'] = r'{LogDir}\SFC Tool.log'.format(**global_vars)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: SFC Tool\n'.format(KIT_NAME_FULL))
|
print_info('{}: SFC Tool\n'.format(KIT_NAME_FULL))
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
'CalledProcessError': 'Unknown Error',
|
'CalledProcessError': 'Unknown Error',
|
||||||
},
|
},
|
||||||
'Warning': {
|
'Warning': {
|
||||||
'GenericRepair': 'Repaired',
|
'GenericRepair': 'Repaired',
|
||||||
}}
|
}}
|
||||||
if ask('Run a SFC scan now?'):
|
if ask('Run a SFC scan now?'):
|
||||||
try_and_print(message='SFC scan...',
|
try_and_print(message='SFC scan...',
|
||||||
function=run_sfc_scan, other_results=other_results)
|
function=run_sfc_scan, other_results=other_results)
|
||||||
else:
|
else:
|
||||||
abort()
|
abort()
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause('Press Enter to exit...')
|
pause('Press Enter to exit...')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,107 +1,107 @@
|
||||||
# Wizard Kit: System Checklist
|
# Wizard Kit: System Checklist
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
sys.path.append(os.getcwd())
|
||||||
from functions.activation import *
|
from functions.activation import *
|
||||||
from functions.cleanup import *
|
from functions.cleanup import *
|
||||||
from functions.diags 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.setup import *
|
from functions.setup import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: System Checklist Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: System Checklist Tool'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\System Checklist.log'.format(**global_vars)
|
global_vars['LogFile'] = r'{LogDir}\System Checklist.log'.format(**global_vars)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: System Checklist Tool\n'.format(KIT_NAME_FULL))
|
print_info('{}: System Checklist Tool\n'.format(KIT_NAME_FULL))
|
||||||
ticket_number = get_ticket_number()
|
ticket_number = get_ticket_number()
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
'CalledProcessError': 'Unknown Error',
|
'CalledProcessError': 'Unknown Error',
|
||||||
'BIOSKeyNotFoundError': 'BIOS key not found',
|
'BIOSKeyNotFoundError': 'BIOS key not found',
|
||||||
},
|
},
|
||||||
'Warning': {}}
|
'Warning': {}}
|
||||||
print_info('Starting System Checklist for Ticket #{}\n'.format(
|
print_info('Starting System Checklist for Ticket #{}\n'.format(
|
||||||
ticket_number))
|
ticket_number))
|
||||||
|
|
||||||
# Configure
|
# Configure
|
||||||
print_info('Configure')
|
print_info('Configure')
|
||||||
if global_vars['OS']['Version'] == '10':
|
if global_vars['OS']['Version'] == '10':
|
||||||
try_and_print(message='Explorer...',
|
try_and_print(message='Explorer...',
|
||||||
function=config_explorer_system, cs='Done')
|
function=config_explorer_system, cs='Done')
|
||||||
try_and_print(message='Updating Clock...',
|
try_and_print(message='Updating Clock...',
|
||||||
function=update_clock, cs='Done')
|
function=update_clock, cs='Done')
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
print_info('Cleanup')
|
print_info('Cleanup')
|
||||||
try_and_print(message='Desktop...',
|
try_and_print(message='Desktop...',
|
||||||
function=cleanup_desktop, cs='Done')
|
function=cleanup_desktop, cs='Done')
|
||||||
try_and_print(message='AdwCleaner...',
|
try_and_print(message='AdwCleaner...',
|
||||||
function=cleanup_adwcleaner, cs='Done')
|
function=cleanup_adwcleaner, cs='Done')
|
||||||
|
|
||||||
# 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')
|
function=run_aida64, cs='Done')
|
||||||
try_and_print(message='File listing...',
|
try_and_print(message='File listing...',
|
||||||
function=backup_file_list, cs='Done')
|
function=backup_file_list, cs='Done')
|
||||||
try_and_print(message='Power plans...',
|
try_and_print(message='Power plans...',
|
||||||
function=backup_power_plans, cs='Done')
|
function=backup_power_plans, cs='Done')
|
||||||
try_and_print(message='Product Keys...',
|
try_and_print(message='Product Keys...',
|
||||||
function=run_produkey, cs='Done')
|
function=run_produkey, cs='Done')
|
||||||
try_and_print(message='Registry...',
|
try_and_print(message='Registry...',
|
||||||
function=backup_registry, cs='Done')
|
function=backup_registry, cs='Done')
|
||||||
|
|
||||||
# User data
|
# User data
|
||||||
print_info('User Data')
|
print_info('User Data')
|
||||||
show_user_data_summary()
|
show_user_data_summary()
|
||||||
|
|
||||||
# Summary
|
# Summary
|
||||||
print_info('Summary')
|
print_info('Summary')
|
||||||
try_and_print(message='Operating System:',
|
try_and_print(message='Operating System:',
|
||||||
function=show_os_name, ns='Unknown', silent_function=False)
|
function=show_os_name, ns='Unknown', silent_function=False)
|
||||||
try_and_print(message='Activation:',
|
try_and_print(message='Activation:',
|
||||||
function=show_os_activation, ns='Unknown', silent_function=False)
|
function=show_os_activation, ns='Unknown', silent_function=False)
|
||||||
if (not windows_is_activated()
|
if (not windows_is_activated()
|
||||||
and global_vars['OS']['Version'] in ('8', '10')):
|
and global_vars['OS']['Version'] in ('8', '10')):
|
||||||
try_and_print(message='BIOS Activation:',
|
try_and_print(message='BIOS Activation:',
|
||||||
function=activate_with_bios,
|
function=activate_with_bios,
|
||||||
other_results=other_results)
|
other_results=other_results)
|
||||||
try_and_print(message='Installed Office:',
|
try_and_print(message='Installed Office:',
|
||||||
function=get_installed_office, ns='Unknown', print_return=True)
|
function=get_installed_office, ns='Unknown', print_return=True)
|
||||||
show_free_space()
|
show_free_space()
|
||||||
try_and_print(message='Installed RAM:',
|
try_and_print(message='Installed RAM:',
|
||||||
function=show_installed_ram, ns='Unknown', silent_function=False)
|
function=show_installed_ram, ns='Unknown', silent_function=False)
|
||||||
|
|
||||||
# Upload info
|
# Upload info
|
||||||
if ENABLED_UPLOAD_DATA:
|
if ENABLED_UPLOAD_DATA:
|
||||||
print_info('Finalizing')
|
print_info('Finalizing')
|
||||||
try_and_print(message='Compressing Info...',
|
try_and_print(message='Compressing Info...',
|
||||||
function=compress_info, cs='Done')
|
function=compress_info, cs='Done')
|
||||||
try_and_print(message='Uploading to NAS...',
|
try_and_print(message='Uploading to NAS...',
|
||||||
function=upload_info, cs='Done')
|
function=upload_info, cs='Done')
|
||||||
|
|
||||||
# Play audio, show devices, open Windows updates, and open Activation
|
# Play audio, show devices, open Windows updates, and open Activation
|
||||||
popen_program(['mmc', 'devmgmt.msc'])
|
popen_program(['mmc', 'devmgmt.msc'])
|
||||||
run_hwinfo_sensors()
|
run_hwinfo_sensors()
|
||||||
popen_program(['control', '/name', 'Microsoft.WindowsUpdate'])
|
popen_program(['control', '/name', 'Microsoft.WindowsUpdate'])
|
||||||
if not windows_is_activated():
|
if not windows_is_activated():
|
||||||
popen_program('slui')
|
popen_program('slui')
|
||||||
sleep(3)
|
sleep(3)
|
||||||
run_xmplay()
|
run_xmplay()
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause('Press Enter exit...')
|
pause('Press Enter exit...')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,124 +1,124 @@
|
||||||
# Wizard Kit: System Diagnostics
|
# Wizard Kit: System Diagnostics
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
sys.path.append(os.getcwd())
|
||||||
from functions.browsers import *
|
from functions.browsers import *
|
||||||
from functions.diags 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 *
|
||||||
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(
|
global_vars['LogFile'] = r'{LogDir}\System Diagnostics.log'.format(
|
||||||
**global_vars)
|
**global_vars)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: System Diagnostics Tool\n'.format(KIT_NAME_FULL))
|
print_info('{}: System Diagnostics Tool\n'.format(KIT_NAME_FULL))
|
||||||
ticket_number = get_ticket_number()
|
ticket_number = get_ticket_number()
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
'CalledProcessError': 'Unknown Error',
|
'CalledProcessError': 'Unknown Error',
|
||||||
},
|
},
|
||||||
'Warning': {
|
'Warning': {
|
||||||
'GenericRepair': 'Repaired',
|
'GenericRepair': 'Repaired',
|
||||||
'UnsupportedOSError': 'Unsupported OS',
|
'UnsupportedOSError': 'Unsupported OS',
|
||||||
}}
|
}}
|
||||||
print_info('Starting System Diagnostics for Ticket #{}\n'.format(
|
print_info('Starting System Diagnostics for Ticket #{}\n'.format(
|
||||||
ticket_number))
|
ticket_number))
|
||||||
|
|
||||||
# Sanitize Environment
|
# Sanitize Environment
|
||||||
print_info('Sanitizing Environment')
|
print_info('Sanitizing Environment')
|
||||||
# try_and_print(message='Killing processes...',
|
# try_and_print(message='Killing processes...',
|
||||||
# function=run_process_killer, cs='Done')
|
# function=run_process_killer, cs='Done')
|
||||||
try_and_print(message='Running RKill...',
|
try_and_print(message='Running RKill...',
|
||||||
function=run_rkill, cs='Done')
|
function=run_rkill, cs='Done')
|
||||||
try_and_print(message='Running TDSSKiller...',
|
try_and_print(message='Running TDSSKiller...',
|
||||||
function=run_tdsskiller, cs='Done')
|
function=run_tdsskiller, cs='Done')
|
||||||
|
|
||||||
# Re-run if earlier process was stopped.
|
# Re-run if earlier process was stopped.
|
||||||
stay_awake()
|
stay_awake()
|
||||||
|
|
||||||
# Start diags
|
# Start diags
|
||||||
print_info('Starting Background Scans')
|
print_info('Starting Background Scans')
|
||||||
check_connection()
|
check_connection()
|
||||||
try_and_print(message='Running HitmanPro...',
|
try_and_print(message='Running HitmanPro...',
|
||||||
function=run_hitmanpro, cs='Started')
|
function=run_hitmanpro, cs='Started')
|
||||||
try_and_print(message='Running Autoruns...',
|
try_and_print(message='Running Autoruns...',
|
||||||
function=run_autoruns, cs='Started')
|
function=run_autoruns, cs='Started')
|
||||||
|
|
||||||
# OS Health Checks
|
# OS Health Checks
|
||||||
print_info('OS Health Checks')
|
print_info('OS Health Checks')
|
||||||
try_and_print(
|
try_and_print(
|
||||||
message='CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env']),
|
message='CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env']),
|
||||||
function=run_chkdsk, other_results=other_results)
|
function=run_chkdsk, other_results=other_results)
|
||||||
try_and_print(message='SFC scan...',
|
try_and_print(message='SFC scan...',
|
||||||
function=run_sfc_scan, other_results=other_results)
|
function=run_sfc_scan, other_results=other_results)
|
||||||
try_and_print(message='DISM CheckHealth...',
|
try_and_print(message='DISM CheckHealth...',
|
||||||
function=run_dism, other_results=other_results, repair=False)
|
function=run_dism, other_results=other_results, repair=False)
|
||||||
|
|
||||||
# Scan for supported browsers
|
# Scan for supported browsers
|
||||||
print_info('Scanning for browsers')
|
print_info('Scanning for browsers')
|
||||||
scan_for_browsers()
|
scan_for_browsers()
|
||||||
|
|
||||||
# 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')
|
function=run_aida64, cs='Done')
|
||||||
try_and_print(message='BleachBit report...',
|
try_and_print(message='BleachBit report...',
|
||||||
function=run_bleachbit, cs='Done')
|
function=run_bleachbit, cs='Done')
|
||||||
backup_browsers()
|
backup_browsers()
|
||||||
try_and_print(message='File listing...',
|
try_and_print(message='File listing...',
|
||||||
function=backup_file_list, cs='Done')
|
function=backup_file_list, cs='Done')
|
||||||
try_and_print(message='Power plans...',
|
try_and_print(message='Power plans...',
|
||||||
function=backup_power_plans, cs='Done')
|
function=backup_power_plans, cs='Done')
|
||||||
try_and_print(message='Product Keys...',
|
try_and_print(message='Product Keys...',
|
||||||
function=run_produkey, cs='Done')
|
function=run_produkey, cs='Done')
|
||||||
try_and_print(message='Registry...',
|
try_and_print(message='Registry...',
|
||||||
function=backup_registry, cs='Done')
|
function=backup_registry, cs='Done')
|
||||||
|
|
||||||
# Summary
|
# Summary
|
||||||
print_info('Summary')
|
print_info('Summary')
|
||||||
try_and_print(message='Temp Size:',
|
try_and_print(message='Temp Size:',
|
||||||
function=show_temp_files_size, silent_function=False)
|
function=show_temp_files_size, silent_function=False)
|
||||||
show_free_space()
|
show_free_space()
|
||||||
try_and_print(message='Installed RAM:',
|
try_and_print(message='Installed RAM:',
|
||||||
function=show_installed_ram, ns='Unknown', silent_function=False)
|
function=show_installed_ram, ns='Unknown', silent_function=False)
|
||||||
try_and_print(message='Installed Office:',
|
try_and_print(message='Installed Office:',
|
||||||
function=get_installed_office, ns='Unknown', print_return=True)
|
function=get_installed_office, ns='Unknown', print_return=True)
|
||||||
try_and_print(message='Product Keys:',
|
try_and_print(message='Product Keys:',
|
||||||
function=get_product_keys, ns='Unknown', print_return=True)
|
function=get_product_keys, ns='Unknown', print_return=True)
|
||||||
try_and_print(message='Operating System:',
|
try_and_print(message='Operating System:',
|
||||||
function=show_os_name, ns='Unknown', silent_function=False)
|
function=show_os_name, ns='Unknown', silent_function=False)
|
||||||
try_and_print(message='',
|
try_and_print(message='',
|
||||||
function=show_os_activation, ns='Unknown', silent_function=False)
|
function=show_os_activation, ns='Unknown', silent_function=False)
|
||||||
|
|
||||||
# User data
|
# User data
|
||||||
print_info('User Data')
|
print_info('User Data')
|
||||||
try:
|
try:
|
||||||
show_user_data_summary()
|
show_user_data_summary()
|
||||||
except Exception:
|
except Exception:
|
||||||
print_error(' Unknown error.')
|
print_error(' Unknown error.')
|
||||||
|
|
||||||
# Upload info
|
# Upload info
|
||||||
if ENABLED_UPLOAD_DATA:
|
if ENABLED_UPLOAD_DATA:
|
||||||
print_info('Finalizing')
|
print_info('Finalizing')
|
||||||
try_and_print(message='Compressing Info...',
|
try_and_print(message='Compressing Info...',
|
||||||
function=compress_info, cs='Done')
|
function=compress_info, cs='Done')
|
||||||
try_and_print(message='Uploading to NAS...',
|
try_and_print(message='Uploading to NAS...',
|
||||||
function=upload_info, cs='Done')
|
function=upload_info, cs='Done')
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause('Press Enter to exit...')
|
pause('Press Enter to exit...')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,28 +1,28 @@
|
||||||
# Wizard Kit: Search for product keys in the transfer folder
|
# Wizard Kit: Search for product keys in the transfer folder
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
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)
|
global_vars['LogFile'] = r'{LogDir}\Transferred Keys.log'.format(**global_vars)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: Transferred Key Finder\n'.format(KIT_NAME_FULL))
|
print_info('{}: Transferred Key Finder\n'.format(KIT_NAME_FULL))
|
||||||
try_and_print(message='Searching for keys...',
|
try_and_print(message='Searching for keys...',
|
||||||
function=list_clientdir_keys, print_return=True)
|
function=list_clientdir_keys, print_return=True)
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,143 +1,143 @@
|
||||||
# Wizard Kit: Download the latest versions of the programs in the kit
|
# Wizard Kit: Download the latest versions of the programs in the kit
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
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))
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: Kit Update Tool\n'.format(KIT_NAME_FULL))
|
print_info('{}: Kit Update Tool\n'.format(KIT_NAME_FULL))
|
||||||
other_results = {
|
other_results = {
|
||||||
'Error': {
|
'Error': {
|
||||||
'CalledProcessError': 'Unknown Error',
|
'CalledProcessError': 'Unknown Error',
|
||||||
}}
|
}}
|
||||||
|
|
||||||
## Prep ##
|
## Prep ##
|
||||||
update_sdio = ask('Update SDI Origin?')
|
update_sdio = ask('Update SDI Origin?')
|
||||||
|
|
||||||
## Download ##
|
## Download ##
|
||||||
print_success('Downloading tools')
|
print_success('Downloading tools')
|
||||||
|
|
||||||
# Data Recovery
|
# Data Recovery
|
||||||
print_info(' Data Recovery')
|
print_info(' Data Recovery')
|
||||||
try_and_print(message='TestDisk / PhotoRec...', function=update_testdisk, other_results=other_results, width=40)
|
try_and_print(message='TestDisk / PhotoRec...', function=update_testdisk, other_results=other_results, width=40)
|
||||||
|
|
||||||
# Data Transfers
|
# Data Transfers
|
||||||
print_info(' Data Transfers')
|
print_info(' Data Transfers')
|
||||||
try_and_print(message='FastCopy...', function=update_fastcopy, other_results=other_results, width=40)
|
try_and_print(message='FastCopy...', function=update_fastcopy, other_results=other_results, width=40)
|
||||||
try_and_print(message='wimlib...', function=update_wimlib, other_results=other_results, width=40)
|
try_and_print(message='wimlib...', function=update_wimlib, other_results=other_results, width=40)
|
||||||
try_and_print(message='XYplorer...', function=update_xyplorer, other_results=other_results, width=40)
|
try_and_print(message='XYplorer...', function=update_xyplorer, other_results=other_results, width=40)
|
||||||
|
|
||||||
# Diagnostics
|
# Diagnostics
|
||||||
print_info(' Diagnostics')
|
print_info(' Diagnostics')
|
||||||
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='BlueScreenView...', 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='HitmanPro...', 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='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
|
||||||
print_info(' Drivers')
|
print_info(' Drivers')
|
||||||
try_and_print(message='Intel RST...', function=update_intel_rst, other_results=other_results, width=40)
|
try_and_print(message='Intel RST...', function=update_intel_rst, other_results=other_results, width=40)
|
||||||
try_and_print(message='Intel SSD Toolbox...', function=update_intel_ssd_toolbox, other_results=other_results, width=40)
|
try_and_print(message='Intel SSD Toolbox...', function=update_intel_ssd_toolbox, other_results=other_results, width=40)
|
||||||
try_and_print(message='Samsing Magician...', function=update_samsung_magician, other_results=other_results, width=40)
|
try_and_print(message='Samsing Magician...', function=update_samsung_magician, other_results=other_results, width=40)
|
||||||
if update_sdio:
|
if update_sdio:
|
||||||
try_and_print(message='Snappy Driver Installer Origin...', function=update_sdi_origin, other_results=other_results, width=40)
|
try_and_print(message='Snappy Driver Installer Origin...', function=update_sdi_origin, other_results=other_results, width=40)
|
||||||
|
|
||||||
# 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='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)
|
||||||
update_all_ninite(other_results=other_results, width=40)
|
update_all_ninite(other_results=other_results, width=40)
|
||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
print_info(' Misc')
|
print_info(' Misc')
|
||||||
try_and_print(message='Caffeine...', function=update_caffeine, other_results=other_results, width=40)
|
try_and_print(message='Caffeine...', function=update_caffeine, other_results=other_results, width=40)
|
||||||
try_and_print(message='Classic Start Skin...', function=update_classic_start_skin, other_results=other_results, width=40)
|
try_and_print(message='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='FirefoxExtensions...', 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='TreeSizeFree...', function=update_treesizefree, other_results=other_results, width=40)
|
try_and_print(message='TreeSizeFree...', function=update_treesizefree, other_results=other_results, width=40)
|
||||||
try_and_print(message='XMPlay...', function=update_xmplay, other_results=other_results, width=40)
|
try_and_print(message='XMPlay...', function=update_xmplay, other_results=other_results, width=40)
|
||||||
|
|
||||||
# Repairs
|
# Repairs
|
||||||
print_info(' Repairs')
|
print_info(' Repairs')
|
||||||
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='TDSSKiller...', function=update_tdsskiller, other_results=other_results, width=40)
|
||||||
|
|
||||||
# Uninstallers
|
# Uninstallers
|
||||||
print_info(' Uninstallers')
|
print_info(' Uninstallers')
|
||||||
try_and_print(message='IObit Uninstaller...', function=update_iobit_uninstaller, other_results=other_results, width=40)
|
try_and_print(message='IObit Uninstaller...', function=update_iobit_uninstaller, other_results=other_results, width=40)
|
||||||
|
|
||||||
## Review ##
|
## Review ##
|
||||||
print_standard('Please review the results and download/extract any missing items to .cbin')
|
print_standard('Please review the results and download/extract any missing items to .cbin')
|
||||||
pause('Press Enter to compress the .cbin items')
|
pause('Press Enter to compress the .cbin items')
|
||||||
|
|
||||||
## Compress ##
|
## Compress ##
|
||||||
print_success('Compressing tools')
|
print_success('Compressing tools')
|
||||||
print_info(' _Drivers')
|
print_info(' _Drivers')
|
||||||
for item in os.scandir(r'{}\_Drivers'.format(global_vars['CBinDir'])):
|
for item in os.scandir(r'{}\_Drivers'.format(global_vars['CBinDir'])):
|
||||||
if not re.search(r'^(_Drivers|.*7z)$', item.name, re.IGNORECASE):
|
if not re.search(r'^(_Drivers|.*7z)$', item.name, re.IGNORECASE):
|
||||||
try_and_print(
|
try_and_print(
|
||||||
message='{}...'.format(item.name),
|
message='{}...'.format(item.name),
|
||||||
function=compress_and_remove_item,
|
function=compress_and_remove_item,
|
||||||
other_results = other_results,
|
other_results = other_results,
|
||||||
width=40,
|
width=40,
|
||||||
item = item)
|
item = item)
|
||||||
print_info(' .cbin')
|
print_info(' .cbin')
|
||||||
for item in os.scandir(global_vars['CBinDir']):
|
for item in os.scandir(global_vars['CBinDir']):
|
||||||
if not re.search(r'^(_Drivers|_include|.*7z)$', item.name, re.IGNORECASE):
|
if not re.search(r'^(_Drivers|_include|.*7z)$', item.name, re.IGNORECASE):
|
||||||
try_and_print(
|
try_and_print(
|
||||||
message='{}...'.format(item.name),
|
message='{}...'.format(item.name),
|
||||||
function=compress_and_remove_item,
|
function=compress_and_remove_item,
|
||||||
other_results = other_results,
|
other_results = other_results,
|
||||||
width=40,
|
width=40,
|
||||||
item = item)
|
item = item)
|
||||||
|
|
||||||
## Search for network Office/QuickBooks installers & add to LAUNCHERS
|
## Search for network Office/QuickBooks installers & add to LAUNCHERS
|
||||||
print_success('Scanning for network installers')
|
print_success('Scanning for network installers')
|
||||||
scan_for_net_installers(OFFICE_SERVER, 'Office', min_year=2010)
|
scan_for_net_installers(OFFICE_SERVER, 'Office', min_year=2010)
|
||||||
scan_for_net_installers(QUICKBOOKS_SERVER, 'QuickBooks', min_year=2015)
|
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()):
|
||||||
print_info(' {}'.format(section))
|
print_info(' {}'.format(section))
|
||||||
for name, options in sorted(LAUNCHERS[section].items()):
|
for name, options in sorted(LAUNCHERS[section].items()):
|
||||||
try_and_print(message=name, function=generate_launcher,
|
try_and_print(message=name, function=generate_launcher,
|
||||||
section=section, name=name, options=options,
|
section=section, name=name, options=options,
|
||||||
other_results=other_results, width=40)
|
other_results=other_results, width=40)
|
||||||
|
|
||||||
# Rename "Copy WizardKit.cmd" (if necessary)
|
# Rename "Copy WizardKit.cmd" (if necessary)
|
||||||
source = r'{}\Scripts\Copy WizardKit.cmd'.format(global_vars['BinDir'])
|
source = r'{}\Scripts\Copy WizardKit.cmd'.format(global_vars['BinDir'])
|
||||||
dest = r'{}\Copy {}.cmd'.format(global_vars['BaseDir'], KIT_NAME_FULL)
|
dest = r'{}\Copy {}.cmd'.format(global_vars['BaseDir'], KIT_NAME_FULL)
|
||||||
if os.path.exists(source):
|
if os.path.exists(source):
|
||||||
try:
|
try:
|
||||||
shutil.move(source, dest)
|
shutil.move(source, dest)
|
||||||
except Exception:
|
except Exception:
|
||||||
print_error(' Failed to rename "{}.cmd" to "{}.cmd"'.format(
|
print_error(' Failed to rename "{}.cmd" to "{}.cmd"'.format(
|
||||||
'Copy WizardKit', KIT_NAME_FULL))
|
'Copy WizardKit', KIT_NAME_FULL))
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,83 +1,83 @@
|
||||||
# Wizard Kit: User Checklist
|
# Wizard Kit: User Checklist
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
sys.path.append(os.getcwd())
|
||||||
from functions.browsers import *
|
from functions.browsers import *
|
||||||
from functions.cleanup import *
|
from functions.cleanup import *
|
||||||
from functions.setup import *
|
from functions.setup import *
|
||||||
init_global_vars()
|
init_global_vars()
|
||||||
os.system('title {}: User Checklist Tool'.format(KIT_NAME_FULL))
|
os.system('title {}: User Checklist Tool'.format(KIT_NAME_FULL))
|
||||||
global_vars['LogFile'] = r'{LogDir}\User Checklist ({USERNAME}).log'.format(
|
global_vars['LogFile'] = r'{LogDir}\User Checklist ({USERNAME}).log'.format(
|
||||||
**global_vars, **global_vars['Env'])
|
**global_vars, **global_vars['Env'])
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: User Checklist\n'.format(KIT_NAME_FULL))
|
print_info('{}: User Checklist\n'.format(KIT_NAME_FULL))
|
||||||
other_results = {
|
other_results = {
|
||||||
'Warning': {
|
'Warning': {
|
||||||
'NotInstalledError': 'Not installed',
|
'NotInstalledError': 'Not installed',
|
||||||
'NoProfilesError': 'No profiles found',
|
'NoProfilesError': 'No profiles found',
|
||||||
}}
|
}}
|
||||||
answer_config_browsers = ask('Install adblock?')
|
answer_config_browsers = ask('Install adblock?')
|
||||||
if answer_config_browsers:
|
if answer_config_browsers:
|
||||||
answer_reset_browsers = ask(
|
answer_reset_browsers = ask(
|
||||||
'Reset browsers to safe defaults first?')
|
'Reset browsers to safe defaults first?')
|
||||||
if global_vars['OS']['Version'] == '10':
|
if global_vars['OS']['Version'] == '10':
|
||||||
answer_config_classicshell = ask('Configure ClassicShell?')
|
answer_config_classicshell = ask('Configure ClassicShell?')
|
||||||
answer_config_explorer_user = ask('Configure Explorer?')
|
answer_config_explorer_user = ask('Configure Explorer?')
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
print_info('Cleanup')
|
print_info('Cleanup')
|
||||||
try_and_print(message='Desktop...',
|
try_and_print(message='Desktop...',
|
||||||
function=cleanup_desktop, cs='Done')
|
function=cleanup_desktop, cs='Done')
|
||||||
|
|
||||||
# Scan for supported browsers
|
# Scan for supported browsers
|
||||||
print_info('Scanning for browsers')
|
print_info('Scanning for browsers')
|
||||||
scan_for_browsers()
|
scan_for_browsers()
|
||||||
|
|
||||||
# Homepages
|
# Homepages
|
||||||
print_info('Current homepages')
|
print_info('Current homepages')
|
||||||
list_homepages()
|
list_homepages()
|
||||||
|
|
||||||
# Backup
|
# Backup
|
||||||
print_info('Backing up browsers')
|
print_info('Backing up browsers')
|
||||||
backup_browsers()
|
backup_browsers()
|
||||||
|
|
||||||
# Reset
|
# Reset
|
||||||
if answer_config_browsers and answer_reset_browsers:
|
if answer_config_browsers and answer_reset_browsers:
|
||||||
print_info('Resetting browsers')
|
print_info('Resetting browsers')
|
||||||
reset_browsers()
|
reset_browsers()
|
||||||
|
|
||||||
# Configure
|
# Configure
|
||||||
print_info('Configuring programs')
|
print_info('Configuring programs')
|
||||||
if answer_config_browsers:
|
if answer_config_browsers:
|
||||||
install_adblock()
|
install_adblock()
|
||||||
if global_vars['OS']['Version'] == '10':
|
if global_vars['OS']['Version'] == '10':
|
||||||
if answer_config_classicshell:
|
if answer_config_classicshell:
|
||||||
try_and_print(message='ClassicStart...',
|
try_and_print(message='ClassicStart...',
|
||||||
function=config_classicstart, cs='Done')
|
function=config_classicstart, cs='Done')
|
||||||
if answer_config_explorer_user:
|
if answer_config_explorer_user:
|
||||||
try_and_print(message='Explorer...',
|
try_and_print(message='Explorer...',
|
||||||
function=config_explorer_user, cs='Done')
|
function=config_explorer_user, cs='Done')
|
||||||
if (not answer_config_browsers
|
if (not answer_config_browsers
|
||||||
and not answer_config_classicshell
|
and not answer_config_classicshell
|
||||||
and not answer_config_explorer_user):
|
and not answer_config_explorer_user):
|
||||||
print_warning(' Skipped')
|
print_warning(' Skipped')
|
||||||
else:
|
else:
|
||||||
if not answer_config_browsers:
|
if not answer_config_browsers:
|
||||||
print_warning(' Skipped')
|
print_warning(' Skipped')
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause('Press Enter to exit...')
|
pause('Press Enter to exit...')
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
|
|
@ -1,53 +1,53 @@
|
||||||
# Wizard Kit: Copy user data to the system from a local or network source
|
# Wizard Kit: Copy user data to the system from a local or network source
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Init
|
# Init
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
sys.path.append(os.getcwd())
|
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)
|
global_vars['LogFile'] = r'{LogDir}\User Data Transfer.log'.format(**global_vars)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
# Prep
|
# Prep
|
||||||
stay_awake()
|
stay_awake()
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('{}: User Data Transfer Tool\n'.format(KIT_NAME_FULL))
|
print_info('{}: User Data Transfer Tool\n'.format(KIT_NAME_FULL))
|
||||||
ticket_number = get_ticket_number()
|
ticket_number = get_ticket_number()
|
||||||
folder_path = r'{}\Transfer'.format(KIT_NAME_SHORT)
|
folder_path = r'{}\Transfer'.format(KIT_NAME_SHORT)
|
||||||
dest = select_destination(folder_path=folder_path,
|
dest = select_destination(folder_path=folder_path,
|
||||||
prompt='Which disk are we transferring to?')
|
prompt='Which disk are we transferring to?')
|
||||||
source = select_source(ticket_number)
|
source = select_source(ticket_number)
|
||||||
items = scan_source(source, dest)
|
items = scan_source(source, dest)
|
||||||
|
|
||||||
# Transfer
|
# Transfer
|
||||||
clear_screen()
|
clear_screen()
|
||||||
print_info('Transfer Details:\n')
|
print_info('Transfer Details:\n')
|
||||||
show_info('Ticket:', ticket_number)
|
show_info('Ticket:', ticket_number)
|
||||||
show_info('Source:', source.path)
|
show_info('Source:', source.path)
|
||||||
show_info('Destination:', dest)
|
show_info('Destination:', dest)
|
||||||
|
|
||||||
if (not ask('Proceed with transfer?')):
|
if (not ask('Proceed with transfer?')):
|
||||||
umount_backup_shares()
|
umount_backup_shares()
|
||||||
abort()
|
abort()
|
||||||
|
|
||||||
print_info('Transferring Data')
|
print_info('Transferring Data')
|
||||||
transfer_source(source, dest, items)
|
transfer_source(source, dest, items)
|
||||||
try_and_print(message='Removing extra files...',
|
try_and_print(message='Removing extra files...',
|
||||||
function=cleanup_transfer, cs='Done', dest_path=dest)
|
function=cleanup_transfer, cs='Done', dest_path=dest)
|
||||||
umount_backup_shares()
|
umount_backup_shares()
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
run_kvrt()
|
run_kvrt()
|
||||||
print_standard('\nDone.')
|
print_standard('\nDone.')
|
||||||
pause("Press Enter to exit...")
|
pause("Press Enter to exit...")
|
||||||
exit_script()
|
exit_script()
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
major_exception()
|
major_exception()
|
||||||
|
|
|
||||||
3
.linux_items/include/live/airootfs/etc/hosts
Normal file
3
.linux_items/include/live/airootfs/etc/hosts
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
127.0.0.1 localhost.localdomain localhost
|
||||||
|
::1 localhost.localdomain localhost
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
Welcome to the [32mWK Linux Toolbox[0m
|
Welcome to the [32m______[0m
|
||||||
|
|
||||||
Some common commands:
|
Some common commands:
|
||||||
[34m%[0m hw-diags
|
[34m%[0m hw-diags
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
# the top and down respectively.
|
# the top and down respectively.
|
||||||
# The width can be negative. In this case the actual width is the
|
# The width can be negative. In this case the actual width is the
|
||||||
# screen width minus the width defined in within the geometry option.
|
# screen width minus the width defined in within the geometry option.
|
||||||
geometry = "300x5-30+20"
|
geometry = "300x5-220+40"
|
||||||
|
|
||||||
# Show how many messages are currently hidden (because of geometry).
|
# Show how many messages are currently hidden (because of geometry).
|
||||||
indicate_hidden = yes
|
indicate_hidden = yes
|
||||||
|
|
|
||||||
|
|
@ -71,10 +71,10 @@ bindsym $mod+r exec "rofi -combi-modi window,drun,run -show combi -modi combi"
|
||||||
bindsym $mod+d exec "urxvt -title 'Hardware Diagnostics' -e hw-diags"
|
bindsym $mod+d exec "urxvt -title 'Hardware Diagnostics' -e hw-diags"
|
||||||
bindsym $mod+f exec "thunar ~"
|
bindsym $mod+f exec "thunar ~"
|
||||||
bindsym $mod+i exec "hardinfo"
|
bindsym $mod+i exec "hardinfo"
|
||||||
bindsym $mod+m exec "urxvt -title 'Mount All Volumes' -e mount-all-volumes"
|
bindsym $mod+m exec "urxvt -title 'Mount All Volumes' -e mount-all-volumes gui"
|
||||||
bindsym $mod+s exec "urxvt -title 'Hardware Diagnostics' -e hw-diags foh"
|
bindsym $mod+s exec "urxvt -title 'Hardware Diagnostics' -e hw-diags quick"
|
||||||
bindsym $mod+t exec "urxvt"
|
bindsym $mod+t exec "urxvt"
|
||||||
bindsym $mod+v exec "urxvt -title 'Hardware Sensors' -e hw-diags-sensors"
|
bindsym $mod+v exec "urxvt -title 'Hardware Sensors' -e watch -c -n1 -t hw-sensors"
|
||||||
bindsym $mod+w exec "firefox"
|
bindsym $mod+w exec "firefox"
|
||||||
|
|
||||||
focus_follows_mouse no
|
focus_follows_mouse no
|
||||||
|
|
|
||||||
|
|
@ -314,7 +314,7 @@
|
||||||
</keybind>
|
</keybind>
|
||||||
<keybind key="W-m">
|
<keybind key="W-m">
|
||||||
<action name="Execute">
|
<action name="Execute">
|
||||||
<command>urxvt -title "Mount all Volumes" -e mount-all-volumes-foh</command>
|
<command>urxvt -title "Mount all Volumes" -e mount-all-volumes gui</command>
|
||||||
</action>
|
</action>
|
||||||
</keybind>
|
</keybind>
|
||||||
<keybind key="W-r">
|
<keybind key="W-r">
|
||||||
|
|
@ -324,7 +324,7 @@
|
||||||
</keybind>
|
</keybind>
|
||||||
<keybind key="W-s">
|
<keybind key="W-s">
|
||||||
<action name="Execute">
|
<action name="Execute">
|
||||||
<command>urxvt -title "Hardware Diagnostics" -e hw-diags foh</command>
|
<command>urxvt -title "Hardware Diagnostics" -e hw-diags quick</command>
|
||||||
</action>
|
</action>
|
||||||
</keybind>
|
</keybind>
|
||||||
<keybind key="W-t">
|
<keybind key="W-t">
|
||||||
|
|
@ -334,7 +334,7 @@
|
||||||
</keybind>
|
</keybind>
|
||||||
<keybind key="W-v">
|
<keybind key="W-v">
|
||||||
<action name="Execute">
|
<action name="Execute">
|
||||||
<command>urxvt -title "Hardware Sensors" -e hw-diags-sensors</command>
|
<command>urxvt -title "Hardware Sensors" -e watch -c -n1 -t hw-sensors</command>
|
||||||
</action>
|
</action>
|
||||||
</keybind>
|
</keybind>
|
||||||
<keybind key="W-w">
|
<keybind key="W-w">
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,7 @@
|
||||||
set -g status off
|
set -g status off
|
||||||
set -g pane-active-border-fg white
|
set -g pane-active-border-fg white
|
||||||
|
|
||||||
|
# Window names
|
||||||
|
set -g set-titles on
|
||||||
|
set -g set-titles-string '#W'
|
||||||
|
setw -g automatic-rename
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
IF_LIST=($(ip l | egrep '^[0-9]+:\s+(eth|en|wl)' | sed -r 's/^[0-9]+:\s+(\w+):.*/\1/' | sort))
|
IF_LIST=($(ip l | egrep '^[0-9]+:\s+(eth|en|wl)' | sed -r 's/^[0-9]+:\s+(\w+):.*/\1/' | sort))
|
||||||
|
|
||||||
|
# Add interfaces to conkyrc
|
||||||
for i in "${IF_LIST[@]}"; do
|
for i in "${IF_LIST[@]}"; do
|
||||||
if [[ "${i:0:1}" == "e" ]]; then
|
if [[ "${i:0:1}" == "e" ]]; then
|
||||||
sed -i -r "s/#Network/Wired:\${alignr}\${addr $i}\n#Network/" ~/.conkyrc
|
sed -i -r "s/#Network/Wired:\${alignr}\${addr $i}\n#Network/" ~/.conkyrc
|
||||||
|
|
@ -10,3 +10,7 @@ for i in "${IF_LIST[@]}"; do
|
||||||
sed -i -r "s/#Network/Wireless:\${alignr}\${addr $i}\n#Network/" ~/.conkyrc
|
sed -i -r "s/#Network/Wireless:\${alignr}\${addr $i}\n#Network/" ~/.conkyrc
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Remove '#Network' line to prevent duplicating lines if this script is re-run
|
||||||
|
sed -i -r "s/#Network//" ~/.conkyrc
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ nm-applet &
|
||||||
cbatticon &
|
cbatticon &
|
||||||
pasystray &
|
pasystray &
|
||||||
connect-to-network &
|
connect-to-network &
|
||||||
|
(sleep 5s && killall dunst) &
|
||||||
$HOME/.urxvt_default_res &
|
$HOME/.urxvt_default_res &
|
||||||
$HOME/.update_wallpaper &
|
$HOME/.update_wallpaper &
|
||||||
$HOME/.update_conky &
|
$HOME/.update_conky &
|
||||||
|
|
|
||||||
|
|
@ -1,69 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## Get connected to a network
|
|
||||||
|
|
||||||
# 1. Checks if already online; skips if so
|
|
||||||
# 2. If no wired devices are present then reload kernel modules
|
|
||||||
# 3. If wireless devices are present, and we're still offline, then connect to WiFi
|
|
||||||
|
|
||||||
die () {
|
|
||||||
echo "$0:" "$@" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function test_connection() {
|
|
||||||
# Check for a valid private IP
|
|
||||||
if ip a | grep -Eq '10.[0-9]+.[0-9]+.[0-9]+'; then
|
|
||||||
return 0 # Class A
|
|
||||||
elif ip a | grep -Eq '172.(1[6-9]|2[0-9]|3[0-1]).[0-9]+.[0-9]+'; then
|
|
||||||
return 0 # Class B
|
|
||||||
elif ip a | grep -Eq '192.168.[0-9]+.[0-9]+'; then
|
|
||||||
return 0 # Class C
|
|
||||||
else
|
|
||||||
return 1 # Invalid private IP
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Load settings
|
|
||||||
if [[ -f "/run/archiso/bootmnt/arch/wifi.conf" ]]; then
|
|
||||||
source "/run/archiso/bootmnt/arch/wifi.conf" || \
|
|
||||||
die "ERROR: failed to load wifi.conf (from /run/archiso/bootmnt/arch/)"
|
|
||||||
else
|
|
||||||
source "/usr/local/bin/wifi.conf" || \
|
|
||||||
die "ERROR: failed to load wifi.conf (from /usr/local/bin/)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Init
|
|
||||||
WIFI_SSID="${WIFI_SSID}"
|
|
||||||
WIFI_PASSWORD="${WIFI_PASSWORD}"
|
|
||||||
|
|
||||||
# Connect to network
|
|
||||||
if ! test_connection; then
|
|
||||||
# LAN
|
|
||||||
if ! ip l | grep -Eq '[0-9]+: +en'; then
|
|
||||||
## Reload the tg3/broadcom driver (known fix for some Dell systems)
|
|
||||||
echo "No wired network adapters found; reloading drivers..."
|
|
||||||
sudo modprobe -r tg3
|
|
||||||
sudo modprobe broadcom
|
|
||||||
sudo modprobe tg3
|
|
||||||
sleep 5s
|
|
||||||
fi
|
|
||||||
|
|
||||||
# WiFi
|
|
||||||
if ip l | grep -Eq '[0-9]+: +wl'; then
|
|
||||||
## Skip if we're already connected (i.e. the code above worked)
|
|
||||||
if ! test_connection; then
|
|
||||||
echo "Attempting to connect to ${WIFI_SSID}..."
|
|
||||||
nmcli dev wifi connect "${WIFI_SSID}" password "${WIFI_PASSWORD}"
|
|
||||||
sleep 5s
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Done
|
|
||||||
if test_connection; then
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
@ -1,135 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## WK HW diagnostics - Launcher
|
|
||||||
|
|
||||||
MODE="$1"
|
|
||||||
SHOW_MENU="True"
|
|
||||||
if [[ "$MODE" =~ ^(all|cpu|drives|foh|smart|badblocks)$ ]]; then
|
|
||||||
SHOW_MENU="False"
|
|
||||||
fi
|
|
||||||
|
|
||||||
SHOW_POWEROPTIONS="False"
|
|
||||||
if [[ "$MODE" =~ ^cli$ ]]; then
|
|
||||||
SHOW_POWEROPTIONS="True"
|
|
||||||
fi
|
|
||||||
|
|
||||||
function pause() {
|
|
||||||
# Pause to review output
|
|
||||||
echo ""
|
|
||||||
echo "$1"
|
|
||||||
read
|
|
||||||
}
|
|
||||||
|
|
||||||
function menu() {
|
|
||||||
while :; do
|
|
||||||
if [[ "$SHOW_MENU" == "False" ]]; then
|
|
||||||
break
|
|
||||||
else
|
|
||||||
clear
|
|
||||||
echo "Hardware Diagnostics"
|
|
||||||
echo "────────────────────"
|
|
||||||
echo "0: Quick drive test"
|
|
||||||
echo "1: All tests"
|
|
||||||
echo "2: Prime95"
|
|
||||||
echo "3: SMART & badblocks"
|
|
||||||
echo "4: SMART"
|
|
||||||
echo "5: badblocks"
|
|
||||||
echo "────────────────────"
|
|
||||||
#if [[ -n $DISPLAY ]] && [[ $(getconf LONG_BIT) -eq "64" ]]; then
|
|
||||||
# echo "6: Graphics Test - FurMark"
|
|
||||||
# echo "7: Graphics Test - Piano"
|
|
||||||
# echo "8: Graphics Test - Volplosion"
|
|
||||||
#fi
|
|
||||||
echo "A: Speaker Test"
|
|
||||||
if [[ -n $DISPLAY ]]; then
|
|
||||||
echo "K: Keyboard Test"
|
|
||||||
fi
|
|
||||||
echo "N: Network Test"
|
|
||||||
echo "────────────────────"
|
|
||||||
echo "M: Screen Saver - Matrix"
|
|
||||||
echo "P: Screen Saver - Pipes"
|
|
||||||
echo "────────────────────"
|
|
||||||
echo "Q: Quit"
|
|
||||||
if [[ "$SHOW_POWEROPTIONS" =~ ^True$ ]]; then
|
|
||||||
echo "R: Reboot"
|
|
||||||
echo "S: Shutdown"
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
read -r -p "Please make a selection: " MODE
|
|
||||||
|
|
||||||
# Check input
|
|
||||||
case $MODE in
|
|
||||||
0)
|
|
||||||
MODE=foh
|
|
||||||
break;;
|
|
||||||
1)
|
|
||||||
MODE=all
|
|
||||||
break;;
|
|
||||||
2)
|
|
||||||
MODE=cpu
|
|
||||||
break;;
|
|
||||||
3)
|
|
||||||
MODE=drives
|
|
||||||
break;;
|
|
||||||
4)
|
|
||||||
MODE=smart
|
|
||||||
break;;
|
|
||||||
5)
|
|
||||||
MODE=badblocks
|
|
||||||
break;;
|
|
||||||
#6)
|
|
||||||
# if [[ -n $DISPLAY ]] && [[ $(getconf LONG_BIT) -eq "64" ]]; then
|
|
||||||
# gputest /fullscreen /test=fur
|
|
||||||
# fi
|
|
||||||
# ;;
|
|
||||||
#7)
|
|
||||||
# if [[ -n $DISPLAY ]] && [[ $(getconf LONG_BIT) -eq "64" ]]; then
|
|
||||||
# gputest /fullscreen /test=pixmark_piano
|
|
||||||
# fi
|
|
||||||
# ;;
|
|
||||||
#8)
|
|
||||||
# if [[ -n $DISPLAY ]] && [[ $(getconf LONG_BIT) -eq "64" ]]; then
|
|
||||||
# gputest /fullscreen /test=pixmark_volplosion
|
|
||||||
# fi
|
|
||||||
# ;;
|
|
||||||
a|A|audio|Audio)
|
|
||||||
clear
|
|
||||||
hw-diags-audio
|
|
||||||
pause "Press Enter to return to menu...";;
|
|
||||||
k|K|keyboard|Keyboard)
|
|
||||||
if [[ -n $DISPLAY ]]; then
|
|
||||||
xev
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
m|M)
|
|
||||||
cmatrix -abs
|
|
||||||
reset
|
|
||||||
clear;;
|
|
||||||
n|N)
|
|
||||||
clear
|
|
||||||
hw-diags-network
|
|
||||||
pause "Press Enter to return to menu...";;
|
|
||||||
p|P)
|
|
||||||
pipes -t 0 -t 1 -t 2 -t 3 -p 5 -R -r 4000
|
|
||||||
reset
|
|
||||||
clear;;
|
|
||||||
q|Q|quit|Quit)
|
|
||||||
exit 0;;
|
|
||||||
r|R)
|
|
||||||
sudo reboot;;
|
|
||||||
s|S)
|
|
||||||
sudo poweroff;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main Loop
|
|
||||||
while :; do
|
|
||||||
menu
|
|
||||||
tmux new-session -s 'hw-session' -n 'hw-window' "hw-diags-inner $MODE"
|
|
||||||
if [[ "$SHOW_MENU" == "False" ]]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## WK HW diagnostics - Audio (Stereo)
|
|
||||||
|
|
||||||
# Unmute and set volume
|
|
||||||
amixer -q set "Master" 80% unmute
|
|
||||||
amixer -q set "PCM" 90% unmute
|
|
||||||
|
|
||||||
speaker-test -c 2 -l 1 -t pink
|
|
||||||
# speaker-test -c 2 -l 1 -t sine
|
|
||||||
speaker-test -c 2 -l 1 -t wav
|
|
||||||
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## WK HW diagnostics - badblocks
|
|
||||||
|
|
||||||
function usage {
|
|
||||||
echo "Usage: $0 log-dir device"
|
|
||||||
echo " e.g. $0 /tmp/tmp.7Mh5f1RhSL9001 /dev/sda"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Bail early
|
|
||||||
if [ ! -d "$1" ]; then
|
|
||||||
usage
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if [ ! -b "$2" ]; then
|
|
||||||
usage
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run Badblocks
|
|
||||||
sudo badblocks -sv -e 1 "$2"
|
|
||||||
tmux capture-pane
|
|
||||||
tmux save-buffer "$1/bb_tmp.out"
|
|
||||||
grep -Ev '^$' "$1/bb_tmp.out" > "$1/${2##*/}_badblocks.log"
|
|
||||||
rm "$1/bb_tmp.out"
|
|
||||||
|
|
@ -1,518 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## WK HW Diagnostics - Main script
|
|
||||||
|
|
||||||
die () {
|
|
||||||
echo "$0:" "$@" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Load settings
|
|
||||||
if [[ -f "/run/archiso/bootmnt/arch/arch.conf" ]]; then
|
|
||||||
source "/run/archiso/bootmnt/arch/arch.conf" || \
|
|
||||||
die "ERROR: failed to load arch.conf (from /run/archiso/bootmnt/arch/)"
|
|
||||||
else
|
|
||||||
source "/usr/local/bin/arch.conf" || \
|
|
||||||
die "ERROR: failed to load arch.conf (from /usr/local/bin/)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get TICKET
|
|
||||||
## Inital SKIP_UPLOAD value loaded from arch.conf
|
|
||||||
SKIP_UPLOAD="${SKIP_UPLOAD}"
|
|
||||||
TICKET=""
|
|
||||||
while [[ "$TICKET" == "" ]]; do
|
|
||||||
if [[ "$1" == "foh" ]]; then
|
|
||||||
TICKET="foh-consult"
|
|
||||||
SKIP_UPLOAD="True"
|
|
||||||
else
|
|
||||||
echo -n "Please enter the Service Order #: "
|
|
||||||
read -r _ticket
|
|
||||||
if echo "$_ticket" | grep -Eq '^[1-9]+\S*$'; then
|
|
||||||
TICKET="$_ticket"
|
|
||||||
elif echo "$_ticket" | grep -Eq '^0'; then
|
|
||||||
SKIP_UPLOAD="True"
|
|
||||||
TICKET="$_ticket"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Init
|
|
||||||
## Tautologies left to show which settings are coming from arch.conf
|
|
||||||
DIAG_DATE="$(date "+%F_%H%M")"
|
|
||||||
DIAG_SERVER_AVAIL="False"
|
|
||||||
DIAG_SERVER="${DIAG_SERVER}"
|
|
||||||
DIAG_SHARE="${DIAG_SHARE}"
|
|
||||||
DIAG_DEST="${DIAG_SHARE}/${TICKET}"
|
|
||||||
DIAG_UPLOAD_NAME="HW-Diagnostics_${DIAG_DATE}"
|
|
||||||
DIAG_USER="${DIAG_USER}"
|
|
||||||
TMP_DIR="$(mktemp -d)"
|
|
||||||
ERRORS="False"
|
|
||||||
TEST_CPU="False"
|
|
||||||
TEST_CPU_LENGTH="${TEST_CPU_LENGTH}"
|
|
||||||
TEST_OVER="False"
|
|
||||||
TEST_SMART="False"
|
|
||||||
TEST_BADBLOCKS="False"
|
|
||||||
SKIP_SHORT_TEST="False"
|
|
||||||
LOG="$TMP_DIR/hw-diags.log"
|
|
||||||
OUT="$TMP_DIR/hw-diags.out"
|
|
||||||
|
|
||||||
# Get list of drives to test (excluding any ARCH drives)
|
|
||||||
|
|
||||||
## Some code borrowed from stackoverflow.com/a/10020397
|
|
||||||
ARCH_DRIVES=($(ls -l /dev/disk/by-label | grep -iE 'ARCH.*[hs]d[a-z]' | sed -r 's#.*/([hs]d[a-z])[0-9]+#\1#' | sort | uniq))
|
|
||||||
DRIVES=($(inxi -Dxx -c 0 | grep -E "ID-[0-9]+" | sed -r 's#.*/dev/([hsv]d[a-z]|nvme[0-9]n[0-9]).*#\1#' | sort))
|
|
||||||
for d in "${ARCH_DRIVES[@]}"; do
|
|
||||||
DRIVES=(${DRIVES[@]//*$d*})
|
|
||||||
done
|
|
||||||
|
|
||||||
# Handle testing runs
|
|
||||||
if [[ "$SKIP_UPLOAD" != "True" ]]; then
|
|
||||||
# Connect to network
|
|
||||||
connect-to-network
|
|
||||||
|
|
||||||
# Test connection to DIAG_SERVER
|
|
||||||
if ip a | grep -Eq '(10.[0-9]+|172.(1[6-9]|2[0-9]|3[0-1])|192.168).[0-9]+.[0-9]+' && \
|
|
||||||
ping -c 1 -q $DIAG_SERVER >/dev/null 2>&1; then
|
|
||||||
DIAG_SERVER_AVAIL="True"
|
|
||||||
ssh-add
|
|
||||||
ssh $DIAG_USER@$DIAG_SERVER mkdir -p "$DIAG_DEST"
|
|
||||||
ssh $DIAG_USER@$DIAG_SERVER chmod 755 "$DIAG_DEST"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Setup Env
|
|
||||||
mkdir "$TMP_DIR" -p 2>/dev/null
|
|
||||||
pushd "$TMP_DIR" >/dev/null
|
|
||||||
touch "$OUT"
|
|
||||||
rm local.txt results.txt 2>/dev/null
|
|
||||||
|
|
||||||
# Functions
|
|
||||||
CLEAR="\e[0m"
|
|
||||||
RED="\e[31m"
|
|
||||||
GREEN="\e[32m"
|
|
||||||
YELLOW="\e[33m"
|
|
||||||
BLUE="\e[34m"
|
|
||||||
function update_progress {
|
|
||||||
echo "HW Diagnostics" > "$LOG"
|
|
||||||
echo "${BLUE}HW Diagnostics${CLEAR}" > "$OUT"
|
|
||||||
echo "───────────────" >> "$LOG"
|
|
||||||
echo "───────────────" >> "$OUT"
|
|
||||||
|
|
||||||
if [[ "$TEST_CPU" == "True" ]]; then
|
|
||||||
echo "" >> "$LOG"
|
|
||||||
echo "" >> "$OUT"
|
|
||||||
if [[ "$cpu_result" == "CS" ]]; then
|
|
||||||
echo "Prime95 CS" >> "$LOG"
|
|
||||||
echo "${BLUE}Prime95${CLEAR} ${GREEN}CS${CLEAR}" >> "$OUT"
|
|
||||||
elif [[ "$cpu_result" == "Working" ]]; then
|
|
||||||
echo "Prime95 Working" >> "$LOG"
|
|
||||||
echo "${BLUE}Prime95${CLEAR} ${YELLOW}Working${CLEAR}" >> "$OUT"
|
|
||||||
elif [[ "$cpu_result" == "Unknown" ]]; then
|
|
||||||
echo "Prime95 Unknown" >> "$LOG"
|
|
||||||
echo "${BLUE}Prime95${CLEAR} ${YELLOW}Unknown${CLEAR}" >> "$OUT"
|
|
||||||
else
|
|
||||||
echo "Prime95 NS" >> "$LOG"
|
|
||||||
echo "${BLUE}Prime95${CLEAR} ${RED}NS${CLEAR}" >> "$OUT"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$TEST_SMART" == "True" ]]; then
|
|
||||||
echo "" >> "$LOG"
|
|
||||||
echo "" >> "$OUT"
|
|
||||||
if [[ "$SKIP_SHORT_TEST" == "True" ]]; then
|
|
||||||
echo "SMART (Quick)" >> "$LOG"
|
|
||||||
echo "${BLUE}SMART${CLEAR} ${YELLOW}(Quick)${CLEAR}" >> "$OUT"
|
|
||||||
else
|
|
||||||
echo "SMART" >> "$LOG"
|
|
||||||
echo "${BLUE}SMART${CLEAR}" >> "$OUT"
|
|
||||||
fi
|
|
||||||
for d in "${DRIVES[@]}"; do
|
|
||||||
d_tmp="${d##*/}_smart_result"
|
|
||||||
eval "d_tmp=\$$d_tmp"
|
|
||||||
if [[ "$d_tmp" == "CS" ]]; then
|
|
||||||
echo "${d##*/} CS" >> "$LOG"
|
|
||||||
echo "${d##*/} ${GREEN}CS${CLEAR}" >> "$OUT"
|
|
||||||
elif [[ "$d_tmp" == "Working" ]]; then
|
|
||||||
echo "${d##*/} Working" >> "$LOG"
|
|
||||||
echo "${d##*/} ${YELLOW}Working${CLEAR}" >> "$OUT"
|
|
||||||
elif [[ "$d_tmp" == "Unknown" ]]; then
|
|
||||||
echo "${d##*/} Unknown" >> "$LOG"
|
|
||||||
echo "${d##*/} ${YELLOW}Unknown${CLEAR}" >> "$OUT"
|
|
||||||
elif [[ "$d_tmp" == "NS" ]]; then
|
|
||||||
echo "${d##*/} NS" >> "$LOG"
|
|
||||||
echo "${d##*/} ${RED}NS${CLEAR}" >> "$OUT"
|
|
||||||
else
|
|
||||||
echo "${d##*/}" >> "$LOG"
|
|
||||||
echo "${d##*/}" >> "$OUT"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$TEST_BADBLOCKS" == "True" ]]; then
|
|
||||||
echo "" >> "$LOG"
|
|
||||||
echo "" >> "$OUT"
|
|
||||||
echo "Badblocks" >> "$LOG"
|
|
||||||
echo "${BLUE}Badblocks${CLEAR}" >> "$OUT"
|
|
||||||
for d in "${DRIVES[@]}"; do
|
|
||||||
d_tmp="${d##*/}_badblocks_result"
|
|
||||||
eval "d_tmp=\$$d_tmp"
|
|
||||||
if [[ "$d_tmp" == "CS" ]]; then
|
|
||||||
echo "${d##*/} CS" >> "$LOG"
|
|
||||||
echo "${d##*/} ${GREEN}CS${CLEAR}" >> "$OUT"
|
|
||||||
elif [[ "$d_tmp" == "Working" ]]; then
|
|
||||||
echo "${d##*/} Working" >> "$LOG"
|
|
||||||
echo "${d##*/} ${YELLOW}Working${CLEAR}" >> "$OUT"
|
|
||||||
elif [[ "$d_tmp" == "Skipped" ]]; then
|
|
||||||
echo "${d##*/} Skipped" >> "$LOG"
|
|
||||||
echo "${d##*/} ${RED}Skipped${CLEAR}" >> "$OUT"
|
|
||||||
elif [[ "$d_tmp" == "NS" ]]; then
|
|
||||||
echo "${d##*/} NS" >> "$LOG"
|
|
||||||
echo "${d##*/} ${RED}NS${CLEAR}" >> "$OUT"
|
|
||||||
else
|
|
||||||
echo "${d##*/}" >> "$LOG"
|
|
||||||
echo "${d##*/}" >> "$OUT"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$TEST_OVER" == "True" ]]; then
|
|
||||||
echo "" >> "$LOG"
|
|
||||||
echo "" >> "$OUT"
|
|
||||||
echo "───────────────" >> "$LOG"
|
|
||||||
echo "───────────────" >> "$OUT"
|
|
||||||
|
|
||||||
if [[ "$ERRORS" == "True" ]]; then
|
|
||||||
echo "HW: Error(s)" >> "$LOG"
|
|
||||||
echo "${RED}HW: Error(s)${CLEAR}" >> "$OUT"
|
|
||||||
else
|
|
||||||
echo "HW: Passed" >> "$LOG"
|
|
||||||
echo "${GREEN}HW: Passed${CLEAR}" >> "$OUT"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update Server
|
|
||||||
if [[ "$DIAG_SERVER_AVAIL" == "True" ]]; then
|
|
||||||
rsync -aqz --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r "$TMP_DIR/" $DIAG_USER@$DIAG_SERVER:"$DIAG_DEST/${DIAG_UPLOAD_NAME}/" --exclude '*.out'
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Select Tests
|
|
||||||
case "$1" in
|
|
||||||
all)
|
|
||||||
TEST_CPU="True"
|
|
||||||
TEST_SMART="True"
|
|
||||||
TEST_BADBLOCKS="True"
|
|
||||||
;;
|
|
||||||
cpu)
|
|
||||||
TEST_CPU="True"
|
|
||||||
TEST_SMART="False"
|
|
||||||
TEST_BADBLOCKS="False"
|
|
||||||
;;
|
|
||||||
drives)
|
|
||||||
TEST_CPU="False"
|
|
||||||
TEST_SMART="True"
|
|
||||||
TEST_BADBLOCKS="True"
|
|
||||||
;;
|
|
||||||
foh)
|
|
||||||
TEST_CPU="False"
|
|
||||||
TEST_SMART="True"
|
|
||||||
TEST_BADBLOCKS="False"
|
|
||||||
SKIP_SHORT_TEST="True"
|
|
||||||
;;
|
|
||||||
smart)
|
|
||||||
TEST_CPU="False"
|
|
||||||
TEST_SMART="True"
|
|
||||||
TEST_BADBLOCKS="False"
|
|
||||||
;;
|
|
||||||
badblocks)
|
|
||||||
TEST_CPU="False"
|
|
||||||
TEST_SMART="False"
|
|
||||||
TEST_BADBLOCKS="True"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [[ "$TEST_CPU" == "False" ]] && \
|
|
||||||
[[ "$TEST_SMART" == "False" ]] && \
|
|
||||||
[[ "$TEST_BADBLOCKS" == "False" ]]; then
|
|
||||||
echo -e "${YELLOW}Aborting HW diagnostics${CLEAR}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Configure display
|
|
||||||
tmux split-window -d -h -l 16 "hw-diags-progress $OUT"
|
|
||||||
update_progress
|
|
||||||
|
|
||||||
# CPU
|
|
||||||
if [[ "$TEST_CPU" == "True" ]]; then
|
|
||||||
clear
|
|
||||||
CPU_ERRORS="False"
|
|
||||||
cpu_result="Working"
|
|
||||||
update_progress
|
|
||||||
apple_fans max
|
|
||||||
(sleep ${TEST_CPU_LENGTH}m && killall -s INT "mprime" >>/dev/null 2>&1) &
|
|
||||||
(sleep ${TEST_CPU_LENGTH}m && killall "hw-diags-sensors" >>/dev/null 2>&1) &
|
|
||||||
(sleep ${TEST_CPU_LENGTH}m && apple_fans auto >>/dev/null 2>&1) &
|
|
||||||
tmux split-window -d -v -l 10 "hw-diags-prime95 $TMP_DIR"
|
|
||||||
hw-diags-sensors "$TMP_DIR" 2>/dev/null
|
|
||||||
sleep 1s
|
|
||||||
# tmux kill-pane -t 1
|
|
||||||
if [[ -f "results.txt" ]]; then
|
|
||||||
mv -nv results.txt "prime-results.txt"
|
|
||||||
if grep -q -iE '(error|fail)' "prime-results.txt"; then
|
|
||||||
cpu_result="NS"
|
|
||||||
CPU_ERRORS="True"
|
|
||||||
else
|
|
||||||
cpu_result="CS"
|
|
||||||
fi
|
|
||||||
elif [[ -f "prime.log" ]]; then
|
|
||||||
if grep -i 'completed' "prime.log" | grep -q -iv '0 errors, 0 warnings'; then
|
|
||||||
cpu_result="NS"
|
|
||||||
CPU_ERRORS="True"
|
|
||||||
else
|
|
||||||
cpu_result="CS"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
CPU_ERRORS="True"
|
|
||||||
cpu_result="Unknown"
|
|
||||||
fi
|
|
||||||
|
|
||||||
update_progress
|
|
||||||
|
|
||||||
if [[ "$CPU_ERRORS" == "True" ]]; then
|
|
||||||
ERRORS="True"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# SMART
|
|
||||||
if [[ "$TEST_SMART" == "True" ]]; then
|
|
||||||
clear
|
|
||||||
echo "Checking SMART status..."
|
|
||||||
for d in "${DRIVES[@]}"; do
|
|
||||||
SMART_ERRORS="False"
|
|
||||||
tmp_device="${d##*/}"
|
|
||||||
eval "${tmp_device}_smart_result=Working"
|
|
||||||
inxi -Dxx | grep "/dev/${tmp_device}" | sed -r "s#.*/dev/${tmp_device} (.*)# \1#" > "${tmp_device}_report.out"
|
|
||||||
inxi -Dxxc 0 | grep "/dev/${tmp_device}" | sed -r "s#.*/dev/${tmp_device} (.*)# \1#" > "${tmp_device}_report.log"
|
|
||||||
update_progress
|
|
||||||
|
|
||||||
# Attempt to enable SMART reporting
|
|
||||||
if sudo smartctl -s on "/dev/${tmp_device}" | grep -q 'device lacks SMART capability'; then
|
|
||||||
SMART_ERRORS="True"
|
|
||||||
eval "${tmp_device}_smart_result=Unknown"
|
|
||||||
echo " ${RED}ERROR: device lacks SMART capability${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
echo " ERROR: device lacks SMART capability" >> "${tmp_device}_report.log"
|
|
||||||
sleep 1s
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Save current SMART values
|
|
||||||
sudo smartctl --all "/dev/${tmp_device}" >> "${tmp_device}-smart.log"
|
|
||||||
sudo smartctl -l error "/dev/${tmp_device}" >> "${tmp_device}-smart-err.log"
|
|
||||||
|
|
||||||
# Check specific SMART results
|
|
||||||
sudo smartctl -A "/dev/${tmp_device}" | grep -E '^\s*(5|9|184|197|198)\s' >> "${tmp_device}-smart-attributes.log"
|
|
||||||
|
|
||||||
# 5 - Reallocated Sectors
|
|
||||||
if grep -qE '^\s*5\s' "${tmp_device}-smart-attributes.log"; then
|
|
||||||
line="$(grep -E '^\s*5\s' "${tmp_device}-smart-attributes.log")"
|
|
||||||
value=$(echo "$line" | sed -r 's/.*\s([0-9]+).*/\1/')
|
|
||||||
echo " Reallocated Sectors: $value" >> "${tmp_device}_report.log"
|
|
||||||
if [[ "$value" -gt 0 ]]; then
|
|
||||||
SMART_ERRORS="True"
|
|
||||||
echo " ${RED}Reallocated Sectors: $value${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
else
|
|
||||||
echo " ${GREEN}Reallocated Sectors: $value${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 9 - Power-on Hours (Warn, but don't prevent badblock scan)
|
|
||||||
if grep -qE '^\s*9\s' "${tmp_device}-smart-attributes.log"; then
|
|
||||||
line="$(grep -E '^\s*9\s' "${tmp_device}-smart-attributes.log")"
|
|
||||||
value=$(echo "$line" | sed -r 's/.*\s([0-9]+).*/\1/')
|
|
||||||
echo " Power-on Hours: $value" >> "${tmp_device}_report.log"
|
|
||||||
if [[ "$value" -gt 18000 ]]; then
|
|
||||||
#SMART_ERRORS="True"
|
|
||||||
echo " ${RED}Power-on Hours: $value (VERY OLD)${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
elif [[ "$value" -gt 12000 ]]; then
|
|
||||||
echo " ${YELLOW}Power-on Hours: $value${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
else
|
|
||||||
echo " ${GREEN}Power-on Hours: $value${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 184 - End-to-End Errors
|
|
||||||
if grep -qE '^\s*184\s' "${tmp_device}-smart-attributes.log"; then
|
|
||||||
line="$(grep -E '^\s*184\s' "${tmp_device}-smart-attributes.log")"
|
|
||||||
value=$(echo "$line" | sed -r 's/.*\s([0-9]+).*/\1/')
|
|
||||||
echo " End-to-End Errors: $value" >> "${tmp_device}_report.log"
|
|
||||||
if [[ "$value" -gt 0 ]]; then
|
|
||||||
SMART_ERRORS="True"
|
|
||||||
echo " ${RED}End-to-End Errors: $value${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
else
|
|
||||||
echo " ${GREEN}End-to-End Errors: $value${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 197 - Current Pending Sectors
|
|
||||||
if grep -qE '^\s*197\s' "${tmp_device}-smart-attributes.log"; then
|
|
||||||
line="$(grep -E '^\s*197\s' "${tmp_device}-smart-attributes.log")"
|
|
||||||
value=$(echo "$line" | sed -r 's/.*\s([0-9]+).*/\1/')
|
|
||||||
echo " Current Pending Sectors: $value" >> "${tmp_device}_report.log"
|
|
||||||
if [[ "$value" -gt 0 ]]; then
|
|
||||||
SMART_ERRORS="True"
|
|
||||||
echo " ${RED}Current Pending Sectors: $value${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
else
|
|
||||||
echo " ${GREEN}Current Pending Sectors: $value${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 198 - Offline Uncorrectable
|
|
||||||
if grep -qE '^\s*198\s' "${tmp_device}-smart-attributes.log"; then
|
|
||||||
line="$(grep -E '^\s*198\s' "${tmp_device}-smart-attributes.log")"
|
|
||||||
value=$(echo "$line" | sed -r 's/.*\s([0-9]+).*/\1/')
|
|
||||||
echo " Offline Uncorrectable: $value" >> "${tmp_device}_report.log"
|
|
||||||
if [[ "$value" -gt 0 ]]; then
|
|
||||||
SMART_ERRORS="True"
|
|
||||||
echo " ${RED}Offline Uncorrectable: $value${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
else
|
|
||||||
echo " ${GREEN}Offline Uncorrectable: $value${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$SMART_ERRORS" == "False" ]] && [[ "$SKIP_SHORT_TEST" == "False" ]]; then
|
|
||||||
if sudo smartctl -c "/dev/${tmp_device}" >>/dev/null 2>&1; then
|
|
||||||
# Determine short-test polling time
|
|
||||||
wait_time=$(sudo smartctl -c "/dev/${tmp_device}" | grep -i 'polling time' | head -1 | sed -r 's/.*\( *([0-9]+)\).*/\1/')
|
|
||||||
wait_time=$(( wait_time + 5))
|
|
||||||
|
|
||||||
# Run short self-test
|
|
||||||
echo " Running SMART short self-test ($wait_time minutes)..."
|
|
||||||
sudo smartctl -t short "/dev/${tmp_device}" >/dev/null
|
|
||||||
sleep ${wait_time}m
|
|
||||||
sudo smartctl -l selftest "/dev/${tmp_device}" >> "${tmp_device}-smart-tests.log"
|
|
||||||
if grep '^#' "${tmp_device}-smart-tests.log" | head -1 | grep -iq 'completed without error'; then
|
|
||||||
echo " ${GREEN}Self-test: passed${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
echo " Self-test: passed" >> "${tmp_device}_report.log"
|
|
||||||
else
|
|
||||||
echo " ${RED}Self-test: failed${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
echo " Self-test: failed" >> "${tmp_device}_report.log"
|
|
||||||
SMART_ERRORS="True"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo " ${RED}ERROR: Unable to run SMART self-test.${CLEAR}" >> "${tmp_device}_report.out"
|
|
||||||
echo " ERROR: Unable to run SMART self-test." >> "${tmp_device}_report.log"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$SMART_ERRORS" == "False" ]]; then
|
|
||||||
eval "${tmp_device}_smart_result=CS"
|
|
||||||
else
|
|
||||||
ERRORS="True"
|
|
||||||
tmp_if="${tmp_device}_smart_result"
|
|
||||||
eval "tmp_if=\$$tmp_if"
|
|
||||||
if [[ "$tmp_if" != "Unknown" ]]; then
|
|
||||||
eval "${tmp_device}_smart_result=NS"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
update_progress
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Badblocks
|
|
||||||
if [[ "$TEST_BADBLOCKS" == "True" ]]; then
|
|
||||||
clear
|
|
||||||
for d in "${DRIVES[@]}"; do
|
|
||||||
# Get SMART results
|
|
||||||
tmp_device="${d##*/}"
|
|
||||||
d_smart="${tmp_device}_smart_result"
|
|
||||||
eval "d_smart=\$$d_smart"
|
|
||||||
|
|
||||||
# Check SMART results
|
|
||||||
if [[ "$d_smart" == "NS" ]]; then
|
|
||||||
echo -e "${RED}Skipping drive: $tmp_device${CLEAR}"
|
|
||||||
eval "${tmp_device}_badblocks_result=Skipped"
|
|
||||||
else
|
|
||||||
eval "${tmp_device}_badblocks_result=Working"
|
|
||||||
update_progress
|
|
||||||
echo "Testing drive: ${tmp_device}"
|
|
||||||
|
|
||||||
# Split and run
|
|
||||||
tmux split-window -v -l 7 "hw-diags-badblocks $TMP_DIR /dev/${tmp_device}"
|
|
||||||
|
|
||||||
# Wait until done
|
|
||||||
sleep 2s
|
|
||||||
while pgrep -G 0 -U 0 -f "badblocks.*${tmp_device}" >/dev/null 2>&1; do
|
|
||||||
sleep 1s;
|
|
||||||
done
|
|
||||||
sleep 2s
|
|
||||||
|
|
||||||
# Check log
|
|
||||||
if grep -Eiq 'Pass completed.*0/0/0 errors' "${tmp_device}_badblocks.log"; then
|
|
||||||
eval "${tmp_device}_badblocks_result=CS"
|
|
||||||
else
|
|
||||||
eval "${tmp_device}_badblocks_result=NS"
|
|
||||||
fi
|
|
||||||
update_progress
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Result Screen
|
|
||||||
TEST_OVER="True"
|
|
||||||
update_progress
|
|
||||||
clear
|
|
||||||
echo "─── RESULTS ───"
|
|
||||||
if [[ "$TEST_CPU" == "True" ]]; then
|
|
||||||
echo -e "${BLUE}CPU:${CLEAR}"
|
|
||||||
if [[ -f "results.txt" ]]; then
|
|
||||||
echo "results.txt"
|
|
||||||
if grep -q -iE '(error|fail)' "prime-results.txt"; then
|
|
||||||
echo -e "${RED}$(grep -q -iE '(error|fail)' "prime-results.txt" | sed -r 's/^/ /' | tail -4)${CLEAR}"
|
|
||||||
else
|
|
||||||
sed -r 's/^/ /' "prime-results.txt" 2>/dev/null | tail -4
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
fi
|
|
||||||
if [[ -f "prime.log" ]]; then
|
|
||||||
echo "prime.log"
|
|
||||||
if grep -i 'completed' "prime.log" | grep -q -iv '0 errors, 0 warnings'; then
|
|
||||||
echo -e "${RED}$(grep -i 'completed' "prime.log" | grep -iv '0 errors, 0 warnings' | sed -r 's/^/ /' | tail -4)${CLEAR}"
|
|
||||||
else
|
|
||||||
grep -i 'completed' "prime.log" | grep -i '0 errors, 0 warnings' | sed -r 's/^.*(Worker #[0-9]+).*(Torture.*)/ \1 \2/' | tail -4
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [[ "$TEST_SMART" == "True" ]] || \
|
|
||||||
[[ "$TEST_BADBLOCKS" == "True" ]]; then
|
|
||||||
for d in "${DRIVES[@]}"; do
|
|
||||||
echo -e "${BLUE}Drive $d:${CLEAR}"
|
|
||||||
if [[ -f "${d##*/}_report.out" ]]; then
|
|
||||||
echo -e "$(cat "${d##*/}_report.out" 2>/dev/null)"
|
|
||||||
fi
|
|
||||||
if [[ -f "${d##*/}_badblocks.log" ]]; then
|
|
||||||
grep 'Pass completed, ' "${d##*/}_badblocks.log" 2>/dev/null | sed -r 's/^Pass completed, / /' 2>/dev/null
|
|
||||||
fi
|
|
||||||
echo ""
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
update_progress
|
|
||||||
|
|
||||||
# System info dump
|
|
||||||
sudo inxi -CDdGlMmNopRsc 0 | grep -Ev '(/dev/ram|No RAID devices|Display Server|multisession)' > "system_info.txt"
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
mkdir "$HOME/Tickets/$TICKET" -p 2>/dev/null
|
|
||||||
rsync -aS --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r "$TMP_DIR/" "$HOME/Tickets/$TICKET/"
|
|
||||||
popd >/dev/null
|
|
||||||
cd "$HOME/Tickets" && tar czf "${DIAG_UPLOAD_NAME}.tgz" "$TICKET"
|
|
||||||
|
|
||||||
# Update Server
|
|
||||||
if [[ "$DIAG_SERVER_AVAIL" == "True" ]]; then
|
|
||||||
rsync -aqz --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r "${DIAG_UPLOAD_NAME}.tgz" $DIAG_USER@$DIAG_SERVER:"$DIAG_DEST/"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# End
|
|
||||||
echo -n "Press Enter to exit..."
|
|
||||||
read -r
|
|
||||||
killall hw-diags-progress >>/dev/null 2>&1
|
|
||||||
exit 0
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## WK HW diagnostics - Network
|
|
||||||
|
|
||||||
function test_connection() {
|
|
||||||
cmd="a"
|
|
||||||
if [[ -e "/sys/class/net/$1" ]]; then
|
|
||||||
cmd="a show $1"
|
|
||||||
fi
|
|
||||||
if ip $cmd | grep -Eq '(10.[0-9]+|172.(1[6-9]|2[0-9]|3[0-1]).[0-9]+|192.168).[0-9]+.[0-9]+'; then
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CLEAR="\e[0m"
|
|
||||||
RED="\e[31m"
|
|
||||||
GREEN="\e[32m"
|
|
||||||
YELLOW="\e[33m"
|
|
||||||
BLUE="\e[34m"
|
|
||||||
|
|
||||||
# Header
|
|
||||||
echo "WK HW Diagnostics - Network"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Start Wifi if necessary
|
|
||||||
echo "Initializing..."
|
|
||||||
connect-to-network >/dev/null 2>&1
|
|
||||||
|
|
||||||
# Check network connection
|
|
||||||
echo -n "Network connection: "
|
|
||||||
if test_connection; then
|
|
||||||
echo -e "${GREEN}OK${CLEAR}"
|
|
||||||
else
|
|
||||||
echo -e "${RED}No access${CLEAR}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check IP addresses
|
|
||||||
for d in /sys/class/net/*; do
|
|
||||||
device="$(basename $d)"
|
|
||||||
if [ "$device" != "lo" ]; then
|
|
||||||
if test_connection $device; then
|
|
||||||
ip="$(ip a show $device | egrep 'inet [0-9]' | sed -r 's#.*inet (.*?/[0-9]+).*#\1#')"
|
|
||||||
echo "$device: $ip" | awk '{printf " %-16s %s\n", $1, $2}'
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Check internet connection
|
|
||||||
echo -n "Internet connection: "
|
|
||||||
if ping -c 2 -q 8.8.8.8 >/dev/null 2>&1; then
|
|
||||||
echo -e "${GREEN}OK${CLEAR}"
|
|
||||||
else
|
|
||||||
echo -e "${RED}No access${CLEAR}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check DNS
|
|
||||||
echo -n "DNS Resolution: "
|
|
||||||
if ping -c 2 -q google.com >/dev/null 2>&1; then
|
|
||||||
echo -e "${GREEN}OK${CLEAR}"
|
|
||||||
else
|
|
||||||
echo -e "${RED}Unable to resolve google.com${CLEAR}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check speed
|
|
||||||
echo "Speedtest:"
|
|
||||||
speedtest-cli --simple | awk '{printf " %-16s %6.2f %s\n", $1, $2, $3}'
|
|
||||||
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## WK HW diagnostics - Progress
|
|
||||||
|
|
||||||
# Loop forever
|
|
||||||
while :; do
|
|
||||||
clear
|
|
||||||
echo -e "$(cat "$1")"
|
|
||||||
sleep 1s
|
|
||||||
done
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## WK HW diagnostics - Sensors
|
|
||||||
|
|
||||||
LOG_DIR="$1"
|
|
||||||
|
|
||||||
function usage {
|
|
||||||
echo "Usage: $0 log-dir"
|
|
||||||
echo " e.g. $0 /tmp/tmp.7Mh5f1RhSL9001"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create directory if necessary
|
|
||||||
if [ ! -d "$LOG_DIR" ]; then
|
|
||||||
LOG_DIR="$(mktemp -d)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run Sensor loop
|
|
||||||
if sensors >/dev/null 2>&1; then
|
|
||||||
while :; do
|
|
||||||
sensors -A | grep -E -i -v '(N/A|RPM|\d+\s+V\s+|^\s*$)' > "$LOG_DIR/sensors.out" 2>/dev/null
|
|
||||||
|
|
||||||
# Colorize
|
|
||||||
# Blue: All temps (superseeded by other colors below)
|
|
||||||
sed -i -r 's#(\+[0-9]+\.[0-9].C)#\\e[34m\1\\e[0m#g' "$LOG_DIR/sensors.out" >/dev/null 2>&1
|
|
||||||
# Green >= 60* C
|
|
||||||
sed -i -r 's#(\+6[0-9]\.[0-9].C)#\\e[32m\1\\e[0m#g' "$LOG_DIR/sensors.out" >/dev/null 2>&1
|
|
||||||
# Yellow >= 70* C
|
|
||||||
sed -i -r 's#(\+7[0-9]\.[0-9].C)#\\e[33m\1\\e[0m#g' "$LOG_DIR/sensors.out" >/dev/null 2>&1
|
|
||||||
# Orange >= 80* C
|
|
||||||
sed -i -r 's#(\+(8[0-9]|9[0-4])\.[0-9].C)#\\e[31\;1m\1\\e[0m#g' "$LOG_DIR/sensors.out" >/dev/null 2>&1
|
|
||||||
# Red >= 95* C
|
|
||||||
sed -i -r 's#(\+(9[5-9]|1[0-9][0-9])\.[0-9].C)#\\e[31m\1\\e[0m#g' "$LOG_DIR/sensors.out" >/dev/null 2>&1
|
|
||||||
|
|
||||||
# Output data
|
|
||||||
clear
|
|
||||||
echo -e "$(cat "$LOG_DIR/sensors.out")"
|
|
||||||
sleep 1s
|
|
||||||
done
|
|
||||||
else
|
|
||||||
echo -e "\e[33mNo sensors found!\nPlease monitor temperatures manually\e[0m"
|
|
||||||
sleep 1h
|
|
||||||
fi
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## Mount all volumes read-only
|
|
||||||
|
|
||||||
# Mount all volumes
|
|
||||||
echo "Mounting all volumes"
|
|
||||||
regex="/dev/((h|s)d[a-z]|md)[0-9]+"
|
|
||||||
for volume in $(inxi -Dopxx | grep -E "$regex" | sed -r "s#.*($regex).*#\1#" | sort); do
|
|
||||||
if grep -q "$volume" /proc/mounts; then
|
|
||||||
if ! mount | grep "/run/archiso/bootmnt" | grep -q "$volume"; then
|
|
||||||
# Show what's already mounted except the WK_ARCH boot device
|
|
||||||
echo "$volume: (Already) mounted $(mount | grep "$volume" | sed -r 's/^\S+ (on.*) type .*/\1/') ($(df -h "$volume" | tail -1 | awk '{print $3, $4}' | sed -r 's/(K|M|G|T|) (.*[0-9])(K|M|G|T|)$/ \1b used, \2 \3b free/'))"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if udevil mount -o ro $volume >/dev/null 2>&1; then
|
|
||||||
echo "$volume: Mounted $(mount | grep "$volume" | sed -r 's/^\S+ (on.*) type .*/\1/') ($(df -h "$volume" | tail -1 | awk '{print $3, $4}' | sed -r 's/(K|M|G|T|) (.*[0-9])(K|M|G|T|)$/ \1b used, \2 \3b free/'))"
|
|
||||||
else
|
|
||||||
echo "$volume: Failed to mount"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Open folder?
|
|
||||||
if echo "$0" | grep -iq foh; then
|
|
||||||
thunar /media
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Done."
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
mount-all-volumes
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
## Mount NAS backup shares
|
|
||||||
|
|
||||||
die () {
|
|
||||||
echo "$0:" "$@" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Load settings
|
|
||||||
if [[ -f "/run/archiso/bootmnt/arch/arch.conf" ]]; then
|
|
||||||
source "/run/archiso/bootmnt/arch/arch.conf" || \
|
|
||||||
die "ERROR: failed to load arch.conf (from /run/archiso/bootmnt/arch/)"
|
|
||||||
else
|
|
||||||
source "/usr/local/bin/arch.conf" || \
|
|
||||||
die "ERROR: failed to load arch.conf (from /usr/local/bin/)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Connect to a network
|
|
||||||
connect-to-network
|
|
||||||
|
|
||||||
# Mount loop
|
|
||||||
echo "Mounting NAS backup shares"
|
|
||||||
for x in {1..4}; do
|
|
||||||
_skip="False"
|
|
||||||
|
|
||||||
# Load Backup share info
|
|
||||||
eval "declare -a _backup=(\${BACKUP_$x[@]})"
|
|
||||||
_name="${_backup[0]}"
|
|
||||||
_ip="${_backup[1]}"
|
|
||||||
_share="${_backup[2]}"
|
|
||||||
_user="${_backup[3]}"
|
|
||||||
_pass="${_backup[4]}"
|
|
||||||
|
|
||||||
# Check backup share info
|
|
||||||
if echo "$_name" | grep -Eq '^\s*$'; then
|
|
||||||
_skip="True";
|
|
||||||
fi
|
|
||||||
if echo "$_ip" | grep -Eq '^\s*$'; then
|
|
||||||
_skip="True";
|
|
||||||
fi
|
|
||||||
if echo "$_share" | grep -Eq '^\s*$'; then
|
|
||||||
_skip="True";
|
|
||||||
fi
|
|
||||||
if echo "$_user" | grep -Eq '^\s*$'; then
|
|
||||||
_skip="True";
|
|
||||||
fi
|
|
||||||
if echo "$_pass" | grep -Eq '^\s*$'; then
|
|
||||||
_skip="True";
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Mount
|
|
||||||
if [[ "$_skip" == "False" ]]; then
|
|
||||||
sudo mkdir "/Backups/$_name" -p
|
|
||||||
if mountpoint -q "/Backups/$_name"; then
|
|
||||||
echo "$_name: (Already) mounted at /Backups/$_name ($(df -h "/Backups/$_name" | tail -1 | awk '{print $4}' | sed -r 's/([KMGT])/ \1b/') free)"
|
|
||||||
else
|
|
||||||
if sudo mount "//$_ip/$_share" "/Backups/$_name" -o username=$_user,password=$_pass 2>/dev/null; then
|
|
||||||
echo "$_name: Mounted at /Backups/$_name ($(df -h "/Backups/$_name" | tail -1 | awk '{print $4}' | sed -r 's/([KMGT])/ \1b/') free)"
|
|
||||||
else
|
|
||||||
rmdir "/Backups/$_name" -p 2>/dev/null
|
|
||||||
echo "$_name: Failed to mount"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
TMP_FILE="$(mktemp)"
|
|
||||||
|
|
||||||
IFS=$'\n'
|
|
||||||
for s in $*; do
|
|
||||||
REGEX="$s"
|
|
||||||
REGEX=$(echo "$REGEX" | sed -r 's/\s+/\\s\*/g')
|
|
||||||
|
|
||||||
# Word Doc
|
|
||||||
for d in *doc; do
|
|
||||||
if antiword "$d" | grep -iqsP "($REGEX)"; then
|
|
||||||
echo "Possible match: $d"
|
|
||||||
echo "$d" >> "$TMP_FILE"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Word Docx
|
|
||||||
for d in *docx; do
|
|
||||||
if unzip -p "$d" word/document.xml | grep -iqsP "($REGEX)"; then
|
|
||||||
echo "Possible match: $d"
|
|
||||||
echo "$d" >> "$TMP_FILE"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
# Cleanup results
|
|
||||||
if [[ -s "$TMP_FILE" ]]; then
|
|
||||||
sort -u "$TMP_FILE" >> "$HOME/msword-matches.txt"
|
|
||||||
fi
|
|
||||||
rm "$TMP_FILE"
|
|
||||||
|
|
||||||
# Done
|
|
||||||
if [[ -s "$HOME/msword-matches.txt" ]]; then
|
|
||||||
echo "Found $(wc -l "$HOME/msword-matches.txt") possible matches"
|
|
||||||
echo "The results have been saved to $HOME"
|
|
||||||
fi
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
# Wizard Kit: Settings - WiFi
|
|
||||||
|
|
||||||
|
|
@ -5,9 +5,11 @@ hfsprogs
|
||||||
i3-gaps
|
i3-gaps
|
||||||
i3lock-fancy-git
|
i3lock-fancy-git
|
||||||
mprime-bin
|
mprime-bin
|
||||||
|
nvme-cli
|
||||||
openbox-patched
|
openbox-patched
|
||||||
papirus-icon-theme
|
papirus-icon-theme
|
||||||
pasystray
|
pasystray
|
||||||
|
smartmontools-svn
|
||||||
testdisk-wip
|
testdisk-wip
|
||||||
ttf-font-awesome
|
ttf-font-awesome
|
||||||
wd719x-firmware
|
wd719x-firmware
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ archiso
|
||||||
attr
|
attr
|
||||||
base-devel
|
base-devel
|
||||||
curl
|
curl
|
||||||
|
dos2unix
|
||||||
git
|
git
|
||||||
libewf
|
libewf
|
||||||
openssh
|
openssh
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ mupdf
|
||||||
ncdu
|
ncdu
|
||||||
network-manager-applet
|
network-manager-applet
|
||||||
networkmanager
|
networkmanager
|
||||||
|
nvme-cli
|
||||||
oblogout
|
oblogout
|
||||||
openbox-patched
|
openbox-patched
|
||||||
p7zip
|
p7zip
|
||||||
|
|
@ -54,12 +55,16 @@ pasystray
|
||||||
pavucontrol
|
pavucontrol
|
||||||
progsreiserfs
|
progsreiserfs
|
||||||
pulseaudio
|
pulseaudio
|
||||||
|
python
|
||||||
|
python-psutil
|
||||||
|
python-requests
|
||||||
qemu-guest-agent
|
qemu-guest-agent
|
||||||
reiserfsprogs
|
reiserfsprogs
|
||||||
rfkill
|
rfkill
|
||||||
rng-tools
|
rng-tools
|
||||||
rofi
|
rofi
|
||||||
rxvt-unicode
|
rxvt-unicode
|
||||||
|
smartmontools-svn
|
||||||
speedtest-cli
|
speedtest-cli
|
||||||
spice-vdagent
|
spice-vdagent
|
||||||
terminus-font
|
terminus-font
|
||||||
|
|
@ -75,6 +80,7 @@ udevil
|
||||||
udisks2
|
udisks2
|
||||||
ufw
|
ufw
|
||||||
unzip
|
unzip
|
||||||
|
util-linux
|
||||||
veracrypt
|
veracrypt
|
||||||
vim
|
vim
|
||||||
virtualbox-guest-modules-arch
|
virtualbox-guest-modules-arch
|
||||||
|
|
|
||||||
18
Build Linux
18
Build Linux
|
|
@ -66,10 +66,7 @@ function load_settings() {
|
||||||
## Answer: https://stackoverflow.com/a/13864829
|
## Answer: https://stackoverflow.com/a/13864829
|
||||||
## Answer by: https://stackoverflow.com/users/1633643/lionel
|
## Answer by: https://stackoverflow.com/users/1633643/lionel
|
||||||
## Answer edit: https://stackoverflow.com/users/-1/community
|
## Answer edit: https://stackoverflow.com/users/-1/community
|
||||||
if [ -z ${KIT_NAME_FULL+x} ]; then
|
if [ ! -z ${KIT_NAME_FULL+x} ]; then
|
||||||
# KIT_NAME_FULL is unset
|
|
||||||
: # pass
|
|
||||||
else
|
|
||||||
# KIT_NAME_FULL is set
|
# KIT_NAME_FULL is set
|
||||||
return 0 # Skip loading settings from main.py
|
return 0 # Skip loading settings from main.py
|
||||||
fi
|
fi
|
||||||
|
|
@ -77,6 +74,7 @@ function load_settings() {
|
||||||
# Copy settings
|
# Copy settings
|
||||||
if [[ ! -e "$BUILD_DIR/main.py" ]] || ask "Overwrite main.py?"; then
|
if [[ ! -e "$BUILD_DIR/main.py" ]] || ask "Overwrite main.py?"; then
|
||||||
cp -bv "$ROOT_DIR/.bin/Scripts/settings/main.py" "$BUILD_DIR/main.py"
|
cp -bv "$ROOT_DIR/.bin/Scripts/settings/main.py" "$BUILD_DIR/main.py"
|
||||||
|
unix2dos "$BUILD_DIR/main.py"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Edit settings
|
# Edit settings
|
||||||
|
|
@ -98,6 +96,8 @@ function copy_live_env() {
|
||||||
|
|
||||||
# Add items
|
# Add items
|
||||||
rsync -aI "$ROOT_DIR/.linux_items/include/live/" "$LIVE_DIR/"
|
rsync -aI "$ROOT_DIR/.linux_items/include/live/" "$LIVE_DIR/"
|
||||||
|
mkdir -p "$LIVE_DIR/airootfs/usr/local/bin"
|
||||||
|
rsync -aI "$ROOT_DIR/.bin/Scripts/" "$LIVE_DIR/airootfs/usr/local/bin/"
|
||||||
|
|
||||||
# Remove items
|
# Remove items
|
||||||
rm "$LIVE_DIR/airootfs/etc/systemd/scripts/choose-mirror"
|
rm "$LIVE_DIR/airootfs/etc/systemd/scripts/choose-mirror"
|
||||||
|
|
@ -140,6 +140,7 @@ function update_live_env() {
|
||||||
echo "[custom]" >> "$LIVE_DIR/pacman.conf"
|
echo "[custom]" >> "$LIVE_DIR/pacman.conf"
|
||||||
echo "SigLevel = Optional TrustAll" >> "$LIVE_DIR/pacman.conf"
|
echo "SigLevel = Optional TrustAll" >> "$LIVE_DIR/pacman.conf"
|
||||||
echo "Server = file://$REPO_DIR" >> "$LIVE_DIR/pacman.conf"
|
echo "Server = file://$REPO_DIR" >> "$LIVE_DIR/pacman.conf"
|
||||||
|
echo "" >> "$LIVE_DIR/pacman.conf"
|
||||||
|
|
||||||
# Mirrors
|
# Mirrors
|
||||||
sed -i -r 's/^(.*mirrorlist.*)$/#NOPE#\1/' "$LIVE_DIR/airootfs/root/customize_airootfs.sh"
|
sed -i -r 's/^(.*mirrorlist.*)$/#NOPE#\1/' "$LIVE_DIR/airootfs/root/customize_airootfs.sh"
|
||||||
|
|
@ -147,7 +148,7 @@ function update_live_env() {
|
||||||
echo "sed -i 's/#Server/Server/g' /etc/pacman.d/mirrorlist" >> "$LIVE_DIR/airootfs/root/customize_airootfs.sh"
|
echo "sed -i 's/#Server/Server/g' /etc/pacman.d/mirrorlist" >> "$LIVE_DIR/airootfs/root/customize_airootfs.sh"
|
||||||
|
|
||||||
# MOTD
|
# MOTD
|
||||||
sed -i "s/WK/$KIT_NAME_SHORT/" "$LIVE_DIR/airootfs/etc/motd"
|
sed -i "s/_+/$KIT_NAME_FULL Linux Environment/" "$LIVE_DIR/airootfs/etc/motd"
|
||||||
|
|
||||||
# Oh My ZSH
|
# Oh My ZSH
|
||||||
git clone --depth=1 git://github.com/robbyrussell/oh-my-zsh.git "$SKEL_DIR/.oh-my-zsh"
|
git clone --depth=1 git://github.com/robbyrussell/oh-my-zsh.git "$SKEL_DIR/.oh-my-zsh"
|
||||||
|
|
@ -156,7 +157,8 @@ function update_live_env() {
|
||||||
|
|
||||||
# Openbox theme
|
# Openbox theme
|
||||||
git clone --depth=1 git@github.com:addy-dclxvi/Openbox-Theme-Collections.git "$TEMP_DIR/ob-themes"
|
git clone --depth=1 git@github.com:addy-dclxvi/Openbox-Theme-Collections.git "$TEMP_DIR/ob-themes"
|
||||||
cp -a "$TEMP_DIR/ob-themes/Triste-Orange" "$LIVE_DIR/airootfs/usr/share/themes/Triste-Orange"
|
mkdir -p "$LIVE_DIR/airootfs/usr/share/themes"
|
||||||
|
cp -a "$TEMP_DIR/ob-themes/Triste-Orange" "$LIVE_DIR/airootfs/usr/share/themes/"
|
||||||
|
|
||||||
# Services
|
# Services
|
||||||
sed -i -r 's/^(.*pacman-init.*)$/#NOPE#\1/' "$LIVE_DIR/airootfs/root/customize_airootfs.sh"
|
sed -i -r 's/^(.*pacman-init.*)$/#NOPE#\1/' "$LIVE_DIR/airootfs/root/customize_airootfs.sh"
|
||||||
|
|
@ -196,10 +198,6 @@ function update_live_env() {
|
||||||
# Wallpaper
|
# Wallpaper
|
||||||
mkdir -p "$LIVE_DIR/airootfs/usr/share/wallpaper"
|
mkdir -p "$LIVE_DIR/airootfs/usr/share/wallpaper"
|
||||||
cp "$ROOT_DIR/Images/Linux.png" "$LIVE_DIR/airootfs/usr/share/wallpaper/burned.in"
|
cp "$ROOT_DIR/Images/Linux.png" "$LIVE_DIR/airootfs/usr/share/wallpaper/burned.in"
|
||||||
|
|
||||||
# WiFi
|
|
||||||
echo "WIFI_SSID='$WIFI_SSID'" >> "$LIVE_DIR/airootfs/usr/local/bin/wifi.conf"
|
|
||||||
echo "WIFI_PASSWORD='$WIFI_PASSWORD'" >> "$LIVE_DIR/airootfs/usr/local/bin/wifi.conf"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function update_repo() {
|
function update_repo() {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue