v1.7.0
Main Kit * Updated tool versions * Added MS Office 2019 installers * Removed network installers * Added "New System Setup" script * Combines "Install SW Bundle", "User Checklist", & "System Checklist" * Added Windows 1809 build numbers * Fixed issues #86 & #87 * Various other minor bug fixes Linux * Complete rewrite of HW Diagnostic sections * New main menu to improve clarity of selections * Allow overriding non-critical SMART attributes * NOTE: This doesn't apply to a full (disk) diagnostic * All tests can now be aborted with CTRL+c * Tmux panes are now resized appropriately if the window is resized * Various other enhancements and bugfixes * Complete rewrite of HW Sensors sections * Temps are now tracked directly allowing for real "Max" values * ddrescue-tui * Added safety check to ensure the map file is saved to persistent storage * Tmux panes are now resized appropriately if the window is resized * Added 'DDRESCUE PROCESS HALTED' message in red * Used to clearly indicate that user interaction is required * If X fails to start it will fallback to HW-Diags CLI * Added option to build Linux with a minimal package set * This is to better support newer Mac systems * This version includes additional Mac kernel modules * NOTE: Minimal builds are still considered experimental * Fixed issues: * #67, #68, #69, #70, #71, #72, #73, #74, #75 * #76, #77, #78, #80, #81, #82, #83, #84, & #85 * Various other minor bug fixes Misc * Updated all Python code to better follow to PEP8 guidelines * Updated crash upload formatting for clarity
This commit is contained in:
commit
046208cfb6
112 changed files with 11548 additions and 10142 deletions
|
|
@ -151,6 +151,7 @@ goto Exit
|
|||
call "%bin%\Scripts\init_client_dir.cmd" /Office
|
||||
set "_odt=False"
|
||||
if %L_PATH% equ 2016 (set "_odt=True")
|
||||
if %L_PATH% equ 2019 (set "_odt=True")
|
||||
if "%_odt%" == "True" (
|
||||
goto LaunchOfficeODT
|
||||
) else (
|
||||
|
|
@ -161,8 +162,8 @@ if "%_odt%" == "True" (
|
|||
rem Prep
|
||||
set "args=-aoa -bso0 -bse0 -bsp0 -p%ARCHIVE_PASSWORD%"
|
||||
set "config=%L_ITEM%"
|
||||
set "dest=%client_dir%\Office\%L_PATH%"
|
||||
set "odt_exe=%L_PATH%\setup.exe"
|
||||
set "dest=%client_dir%\Office\ODT"
|
||||
set "odt_exe=setup.exe"
|
||||
set "source=%cbin%\_Office.7z"
|
||||
|
||||
rem Extract
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.activation import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Windows Activation Tool'.format(KIT_NAME_FULL))
|
||||
|
|
@ -60,3 +59,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -1,35 +0,0 @@
|
|||
sensors.py
|
||||
==========
|
||||
python bindings using ctypes for libsensors3 of the [lm-sensors project](https://github.com/groeck/lm-sensors). The code was written against libsensors 3.3.4.
|
||||
|
||||
For documentation of the low level API see [sensors.h](https://github.com/groeck/lm-sensors/blob/master/lib/sensors.h). For an example of the high level API see [example.py](example.py).
|
||||
|
||||
For a GUI application that displays the sensor readings and is based on this library, take a look at [sensors-unity](https://launchpad.net/sensors-unity).
|
||||
|
||||
Features
|
||||
--------
|
||||
* Full access to low level libsensors3 API
|
||||
* High level iterator API
|
||||
* unicode handling
|
||||
* Python2 and Python3 compatible
|
||||
|
||||
Licensing
|
||||
---------
|
||||
LGPLv2 (same as libsensors3)
|
||||
|
||||
Usage Notes
|
||||
-----------
|
||||
As Python does not support call by reference for primitive types some of the libsensors API had to be adapted:
|
||||
|
||||
```python
|
||||
# nr is changed by refrence in the C API
|
||||
chip_name, nr = sensors.get_detected_chips(None, nr)
|
||||
|
||||
# returns the value. throws on error
|
||||
val = sensors.get_value(chip, subfeature_nr)
|
||||
```
|
||||
|
||||
Missing Features (pull requests are welcome):
|
||||
* `sensors_subfeature_type` enum
|
||||
* `sensors_get_subfeature`
|
||||
* Error handlers
|
||||
|
|
@ -1,236 +0,0 @@
|
|||
"""
|
||||
@package sensors.py
|
||||
Python Bindings for libsensors3
|
||||
|
||||
use the documentation of libsensors for the low level API.
|
||||
see example.py for high level API usage.
|
||||
|
||||
@author: Pavel Rojtberg (http://www.rojtberg.net)
|
||||
@see: https://github.com/paroj/sensors.py
|
||||
@copyright: LGPLv2 (same as libsensors) <http://opensource.org/licenses/LGPL-2.1>
|
||||
"""
|
||||
|
||||
from ctypes import *
|
||||
import ctypes.util
|
||||
|
||||
_libc = cdll.LoadLibrary(ctypes.util.find_library("c"))
|
||||
# see https://github.com/paroj/sensors.py/issues/1
|
||||
_libc.free.argtypes = [c_void_p]
|
||||
|
||||
_hdl = cdll.LoadLibrary(ctypes.util.find_library("sensors"))
|
||||
|
||||
version = c_char_p.in_dll(_hdl, "libsensors_version").value.decode("ascii")
|
||||
|
||||
class bus_id(Structure):
|
||||
_fields_ = [("type", c_short),
|
||||
("nr", c_short)]
|
||||
|
||||
class chip_name(Structure):
|
||||
_fields_ = [("prefix", c_char_p),
|
||||
("bus", bus_id),
|
||||
("addr", c_int),
|
||||
("path", c_char_p)]
|
||||
|
||||
class feature(Structure):
|
||||
_fields_ = [("name", c_char_p),
|
||||
("number", c_int),
|
||||
("type", c_int)]
|
||||
|
||||
# sensors_feature_type
|
||||
IN = 0x00
|
||||
FAN = 0x01
|
||||
TEMP = 0x02
|
||||
POWER = 0x03
|
||||
ENERGY = 0x04
|
||||
CURR = 0x05
|
||||
HUMIDITY = 0x06
|
||||
MAX_MAIN = 0x7
|
||||
VID = 0x10
|
||||
INTRUSION = 0x11
|
||||
MAX_OTHER = 0x12
|
||||
BEEP_ENABLE = 0x18
|
||||
|
||||
class subfeature(Structure):
|
||||
_fields_ = [("name", c_char_p),
|
||||
("number", c_int),
|
||||
("type", c_int),
|
||||
("mapping", c_int),
|
||||
("flags", c_uint)]
|
||||
|
||||
_hdl.sensors_get_detected_chips.restype = POINTER(chip_name)
|
||||
_hdl.sensors_get_features.restype = POINTER(feature)
|
||||
_hdl.sensors_get_all_subfeatures.restype = POINTER(subfeature)
|
||||
_hdl.sensors_get_label.restype = c_void_p # return pointer instead of str so we can free it
|
||||
_hdl.sensors_get_adapter_name.restype = c_char_p # docs do not say whether to free this or not
|
||||
_hdl.sensors_strerror.restype = c_char_p
|
||||
|
||||
### RAW API ###
|
||||
MODE_R = 1
|
||||
MODE_W = 2
|
||||
COMPUTE_MAPPING = 4
|
||||
|
||||
def init(cfg_file = None):
|
||||
file = _libc.fopen(cfg_file.encode("utf-8"), "r") if cfg_file is not None else None
|
||||
|
||||
if _hdl.sensors_init(file) != 0:
|
||||
raise Exception("sensors_init failed")
|
||||
|
||||
if file is not None:
|
||||
_libc.fclose(file)
|
||||
|
||||
def cleanup():
|
||||
_hdl.sensors_cleanup()
|
||||
|
||||
def parse_chip_name(orig_name):
|
||||
ret = chip_name()
|
||||
err= _hdl.sensors_parse_chip_name(orig_name.encode("utf-8"), byref(ret))
|
||||
|
||||
if err < 0:
|
||||
raise Exception(strerror(err))
|
||||
|
||||
return ret
|
||||
|
||||
def strerror(errnum):
|
||||
return _hdl.sensors_strerror(errnum).decode("utf-8")
|
||||
|
||||
def free_chip_name(chip):
|
||||
_hdl.sensors_free_chip_name(byref(chip))
|
||||
|
||||
def get_detected_chips(match, nr):
|
||||
"""
|
||||
@return: (chip, next nr to query)
|
||||
"""
|
||||
_nr = c_int(nr)
|
||||
|
||||
if match is not None:
|
||||
match = byref(match)
|
||||
|
||||
chip = _hdl.sensors_get_detected_chips(match, byref(_nr))
|
||||
chip = chip.contents if bool(chip) else None
|
||||
return chip, _nr.value
|
||||
|
||||
def chip_snprintf_name(chip, buffer_size=200):
|
||||
"""
|
||||
@param buffer_size defaults to the size used in the sensors utility
|
||||
"""
|
||||
ret = create_string_buffer(buffer_size)
|
||||
err = _hdl.sensors_snprintf_chip_name(ret, buffer_size, byref(chip))
|
||||
|
||||
if err < 0:
|
||||
raise Exception(strerror(err))
|
||||
|
||||
return ret.value.decode("utf-8")
|
||||
|
||||
def do_chip_sets(chip):
|
||||
"""
|
||||
@attention this function was not tested
|
||||
"""
|
||||
err = _hdl.sensors_do_chip_sets(byref(chip))
|
||||
if err < 0:
|
||||
raise Exception(strerror(err))
|
||||
|
||||
def get_adapter_name(bus):
|
||||
return _hdl.sensors_get_adapter_name(byref(bus)).decode("utf-8")
|
||||
|
||||
def get_features(chip, nr):
|
||||
"""
|
||||
@return: (feature, next nr to query)
|
||||
"""
|
||||
_nr = c_int(nr)
|
||||
feature = _hdl.sensors_get_features(byref(chip), byref(_nr))
|
||||
feature = feature.contents if bool(feature) else None
|
||||
return feature, _nr.value
|
||||
|
||||
def get_label(chip, feature):
|
||||
ptr = _hdl.sensors_get_label(byref(chip), byref(feature))
|
||||
val = cast(ptr, c_char_p).value.decode("utf-8")
|
||||
_libc.free(ptr)
|
||||
return val
|
||||
|
||||
def get_all_subfeatures(chip, feature, nr):
|
||||
"""
|
||||
@return: (subfeature, next nr to query)
|
||||
"""
|
||||
_nr = c_int(nr)
|
||||
subfeature = _hdl.sensors_get_all_subfeatures(byref(chip), byref(feature), byref(_nr))
|
||||
subfeature = subfeature.contents if bool(subfeature) else None
|
||||
return subfeature, _nr.value
|
||||
|
||||
def get_value(chip, subfeature_nr):
|
||||
val = c_double()
|
||||
err = _hdl.sensors_get_value(byref(chip), subfeature_nr, byref(val))
|
||||
if err < 0:
|
||||
raise Exception(strerror(err))
|
||||
return val.value
|
||||
|
||||
def set_value(chip, subfeature_nr, value):
|
||||
"""
|
||||
@attention this function was not tested
|
||||
"""
|
||||
val = c_double(value)
|
||||
err = _hdl.sensors_set_value(byref(chip), subfeature_nr, byref(val))
|
||||
if err < 0:
|
||||
raise Exception(strerror(err))
|
||||
|
||||
### Convenience API ###
|
||||
class ChipIterator:
|
||||
def __init__(self, match = None):
|
||||
self.match = parse_chip_name(match) if match is not None else None
|
||||
self.nr = 0
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def __next__(self):
|
||||
chip, self.nr = get_detected_chips(self.match, self.nr)
|
||||
|
||||
if chip is None:
|
||||
raise StopIteration
|
||||
|
||||
return chip
|
||||
|
||||
def __del__(self):
|
||||
if self.match is not None:
|
||||
free_chip_name(self.match)
|
||||
|
||||
def next(self): # python2 compability
|
||||
return self.__next__()
|
||||
|
||||
class FeatureIterator:
|
||||
def __init__(self, chip):
|
||||
self.chip = chip
|
||||
self.nr = 0
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def __next__(self):
|
||||
feature, self.nr = get_features(self.chip, self.nr)
|
||||
|
||||
if feature is None:
|
||||
raise StopIteration
|
||||
|
||||
return feature
|
||||
|
||||
def next(self): # python2 compability
|
||||
return self.__next__()
|
||||
|
||||
class SubFeatureIterator:
|
||||
def __init__(self, chip, feature):
|
||||
self.chip = chip
|
||||
self.feature = feature
|
||||
self.nr = 0
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def __next__(self):
|
||||
subfeature, self.nr = get_all_subfeatures(self.chip, self.feature, self.nr)
|
||||
|
||||
if subfeature is None:
|
||||
raise StopIteration
|
||||
|
||||
return subfeature
|
||||
|
||||
def next(self): # python2 compability
|
||||
return self.__next__()
|
||||
|
|
@ -533,6 +533,9 @@ echo -e "${GREEN}Building Kit${CLEAR}"
|
|||
touch "${LOG_FILE}"
|
||||
tmux split-window -dl 10 tail -f "${LOG_FILE}"
|
||||
|
||||
# Zero beginning of device
|
||||
dd bs=4M count=16 if=/dev/zero of="${DEST_DEV}" >> "${LOG_FILE}" 2>&1
|
||||
|
||||
# Format
|
||||
echo "Formatting drive..."
|
||||
if [[ "${USE_MBR}" == "True" ]]; then
|
||||
|
|
|
|||
|
|
@ -79,21 +79,21 @@ if ($MyInvocation.InvocationName -ne ".") {
|
|||
$Path = $Temp
|
||||
|
||||
# 7-Zip
|
||||
DownloadFile -Path $Path -Name "7z-installer.msi" -Url "https://www.7-zip.org/a/7z1805.msi"
|
||||
DownloadFile -Path $Path -Name "7z-extra.7z" -Url "https://www.7-zip.org/a/7z1805-extra.7z"
|
||||
DownloadFile -Path $Path -Name "7z-installer.msi" -Url "https://www.7-zip.org/a/7z1806.msi"
|
||||
DownloadFile -Path $Path -Name "7z-extra.7z" -Url "https://www.7-zip.org/a/7z1806-extra.7z"
|
||||
|
||||
# ConEmu
|
||||
$Url = "https://github.com/Maximus5/ConEmu/releases/download/v18.06.26/ConEmuPack.180626.7z"
|
||||
DownloadFile -Path $Path -Name "ConEmuPack.7z" -Url $Url
|
||||
|
||||
# Notepad++
|
||||
$Url = "https://notepad-plus-plus.org/repository/7.x/7.5.8/npp.7.5.8.bin.minimalist.7z"
|
||||
$Url = "https://notepad-plus-plus.org/repository/7.x/7.6.2/npp.7.6.2.bin.minimalist.7z"
|
||||
DownloadFile -Path $Path -Name "npp.7z" -Url $Url
|
||||
|
||||
# Python
|
||||
$Url = "https://www.python.org/ftp/python/3.7.0/python-3.7.0-embed-win32.zip"
|
||||
$Url = "https://www.python.org/ftp/python/3.7.2/python-3.7.2.post1-embed-win32.zip"
|
||||
DownloadFile -Path $Path -Name "python32.zip" -Url $Url
|
||||
$Url = "https://www.python.org/ftp/python/3.7.0/python-3.7.0-embed-amd64.zip"
|
||||
$Url = "https://www.python.org/ftp/python/3.7.2/python-3.7.2.post1-embed-amd64.zip"
|
||||
DownloadFile -Path $Path -Name "python64.zip" -Url $Url
|
||||
|
||||
# Python: psutil
|
||||
|
|
|
|||
|
|
@ -131,25 +131,25 @@ if ($MyInvocation.InvocationName -ne ".") {
|
|||
## Download Tools ##
|
||||
$ToolSources = @(
|
||||
# 7-Zip
|
||||
@("7z-installer.msi", "https://www.7-zip.org/a/7z1805.msi"),
|
||||
@("7z-extra.7z", "https://www.7-zip.org/a/7z1805-extra.7z"),
|
||||
@("7z-installer.msi", "https://www.7-zip.org/a/7z1806.msi"),
|
||||
@("7z-extra.7z", "https://www.7-zip.org/a/7z1806-extra.7z"),
|
||||
# Blue Screen View
|
||||
@("bluescreenview32.zip", "http://www.nirsoft.net/utils/bluescreenview.zip"),
|
||||
@("bluescreenview64.zip", "http://www.nirsoft.net/utils/bluescreenview-x64.zip"),
|
||||
# ConEmu
|
||||
@("ConEmuPack.7z", "https://github.com/Maximus5/ConEmu/releases/download/v18.06.26/ConEmuPack.180626.7z"),
|
||||
# Fast Copy
|
||||
@("fastcopy.zip", "http://ftp.vector.co.jp/70/64/2323/FastCopy354_installer.zip"),
|
||||
@("fastcopy.zip", "http://ftp.vector.co.jp/70/93/2323/FastCopy361_installer.exe"),
|
||||
# HWiNFO
|
||||
@("hwinfo.zip", "http://app.oldfoss.com:81/download/HWiNFO/hwi_588.zip"),
|
||||
@("hwinfo.zip", "https://www.fosshub.com/HWiNFO.html?dwl=hwi_600.zip"),
|
||||
# Killer Network Drivers
|
||||
@(
|
||||
"killerinf.zip",
|
||||
("http://www.killernetworking.com"+(FindDynamicUrl "http://www.killernetworking.com/driver-downloads/item/killer-drivers-inf" "Download Killer-Ethernet").replace('&', '&'))
|
||||
("https://www.killernetworking.com"+(FindDynamicUrl "https://www.killernetworking.com/killersupport/category/other-downloads" "Download Killer-Ethernet").replace('&', '&'))
|
||||
),
|
||||
# Notepad++
|
||||
@("npp_x86.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.8/npp.7.5.8.bin.minimalist.7z"),
|
||||
@("npp_amd64.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.8/npp.7.5.8.bin.minimalist.x64.7z"),
|
||||
@("npp_x86.7z", "https://notepad-plus-plus.org/repository/7.x/7.6.2/npp.7.6.2.bin.minimalist.7z"),
|
||||
@("npp_amd64.7z", "https://notepad-plus-plus.org/repository/7.x/7.6.2/npp.7.6.2.bin.minimalist.x64.7z"),
|
||||
# NT Password Editor
|
||||
@("ntpwed.zip", "http://cdslow.org.ru/files/ntpwedit/ntpwed07.zip"),
|
||||
# Prime95
|
||||
|
|
@ -159,8 +159,8 @@ if ($MyInvocation.InvocationName -ne ".") {
|
|||
@("produkey32.zip", "http://www.nirsoft.net/utils/produkey.zip"),
|
||||
@("produkey64.zip", "http://www.nirsoft.net/utils/produkey-x64.zip"),
|
||||
# Python
|
||||
@("python32.zip", "https://www.python.org/ftp/python/3.7.0/python-3.7.0-embed-win32.zip"),
|
||||
@("python64.zip", "https://www.python.org/ftp/python/3.7.0/python-3.7.0-embed-amd64.zip"),
|
||||
@("python32.zip", "https://www.python.org/ftp/python/3.7.2/python-3.7.2.post1-embed-win32.zip"),
|
||||
@("python64.zip", "https://www.python.org/ftp/python/3.7.2/python-3.7.2.post1-embed-amd64.zip"),
|
||||
# Python: psutil
|
||||
@(
|
||||
"psutil64.whl",
|
||||
|
|
@ -182,8 +182,8 @@ if ($MyInvocation.InvocationName -ne ".") {
|
|||
@("vcredist_x86.exe", "https://aka.ms/vs/15/release/vc_redist.x86.exe"),
|
||||
@("vcredist_x64.exe", "https://aka.ms/vs/15/release/vc_redist.x64.exe"),
|
||||
# wimlib-imagex
|
||||
@("wimlib32.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip"),
|
||||
@("wimlib64.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-bin.zip")
|
||||
@("wimlib32.zip", "https://wimlib.net/downloads/wimlib-1.13.0-windows-i686-bin.zip"),
|
||||
@("wimlib64.zip", "https://wimlib.net/downloads/wimlib-1.13.0-windows-x86_64-bin.zip")
|
||||
)
|
||||
foreach ($Tool in $ToolSources) {
|
||||
DownloadFile -Path $Temp -Name $Tool[0] -Url $Tool[1]
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.cleanup import *
|
||||
from functions.data import *
|
||||
init_global_vars()
|
||||
|
|
@ -40,3 +39,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Check Disk Tool'.format(KIT_NAME_FULL))
|
||||
|
|
@ -54,3 +53,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -6,8 +6,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.network import *
|
||||
init_global_vars()
|
||||
|
||||
|
|
@ -28,3 +27,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
## Wizard Kit: ddrescue TUI Launcher
|
||||
|
||||
SESSION_NAME="ddrescue-tui"
|
||||
WINDOW_NAME="GNU ddrescue TUI"
|
||||
WINDOW_NAME="ddrescue TUI"
|
||||
MENU="ddrescue-tui-menu"
|
||||
|
||||
function ask() {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ import sys
|
|||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
from functions.ddrescue import *
|
||||
from functions.hw_diags import *
|
||||
init_global_vars()
|
||||
|
|
@ -60,4 +59,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=4 sw=4 ts=4
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -1,39 +0,0 @@
|
|||
#!/bin/python3
|
||||
#
|
||||
## Wizard Kit: SMART attributes display for ddrescue TUI
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.hw_diags import *
|
||||
#init_global_vars()
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
# Prep
|
||||
clear_screen()
|
||||
dev_path = sys.argv[1]
|
||||
devs = scan_disks(True, dev_path)
|
||||
|
||||
# Warn if SMART unavailable
|
||||
if dev_path not in devs:
|
||||
print_error('SMART data not available')
|
||||
exit_script()
|
||||
|
||||
# Initial screen
|
||||
dev = devs[dev_path]
|
||||
clear_screen()
|
||||
show_disk_details(dev, only_attributes=True)
|
||||
|
||||
# Done
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=4 sw=4 ts=4
|
||||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: DISM helper Tool'.format(KIT_NAME_FULL))
|
||||
|
|
@ -55,3 +54,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -6,9 +6,11 @@ from borrowed import acpi
|
|||
from functions.common import *
|
||||
from os import environ
|
||||
|
||||
# Variables
|
||||
|
||||
# STATIC VARIABLES
|
||||
SLMGR = r'{}\System32\slmgr.vbs'.format(environ.get('SYSTEMROOT'))
|
||||
|
||||
|
||||
def activate_with_bios():
|
||||
"""Attempt to activate Windows with a key stored in the BIOS."""
|
||||
# Code borrowed from https://github.com/aeruder/get_win8key
|
||||
|
|
@ -43,6 +45,7 @@ def activate_with_bios():
|
|||
if not windows_is_activated():
|
||||
raise Exception('Activation Failed')
|
||||
|
||||
|
||||
def get_activation_string():
|
||||
"""Get activation status, returns str."""
|
||||
act_str = subprocess.run(
|
||||
|
|
@ -53,6 +56,7 @@ def get_activation_string():
|
|||
act_str = act_str[1].strip()
|
||||
return act_str
|
||||
|
||||
|
||||
def windows_is_activated():
|
||||
"""Check if Windows is activated via slmgr.vbs and return bool."""
|
||||
activation_string = subprocess.run(
|
||||
|
|
@ -62,5 +66,8 @@ def windows_is_activated():
|
|||
|
||||
return bool(activation_string and 'permanent' in activation_string)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import ctypes
|
|||
|
||||
from functions.disk import *
|
||||
|
||||
|
||||
# Regex
|
||||
REGEX_BAD_PATH_NAMES = re.compile(
|
||||
r'([<>:"/\|\?\*]'
|
||||
|
|
@ -12,9 +13,11 @@ REGEX_BAD_PATH_NAMES = re.compile(
|
|||
r'|[\s\.]+$',
|
||||
re.IGNORECASE)
|
||||
|
||||
|
||||
def backup_partition(disk, par):
|
||||
"""Create a backup image of a partition."""
|
||||
if par.get('Image Exists', False) or par['Number'] in disk['Bad Partitions']:
|
||||
if (par.get('Image Exists', False)
|
||||
or par['Number'] in disk['Bad Partitions']):
|
||||
raise GenericAbort
|
||||
|
||||
cmd = [
|
||||
|
|
@ -30,6 +33,7 @@ def backup_partition(disk, par):
|
|||
os.makedirs(dest_dir, exist_ok=True)
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def fix_path(path):
|
||||
"""Replace invalid filename characters with underscores."""
|
||||
local_drive = path[1:2] == ':'
|
||||
|
|
@ -38,6 +42,7 @@ def fix_path(path):
|
|||
new_path = '{}:{}'.format(new_path[0:1], new_path[2:])
|
||||
return new_path
|
||||
|
||||
|
||||
def get_volume_display_name(mountpoint):
|
||||
"""Get display name from volume mountpoint and label, returns str."""
|
||||
name = mountpoint
|
||||
|
|
@ -66,6 +71,7 @@ def get_volume_display_name(mountpoint):
|
|||
|
||||
return name
|
||||
|
||||
|
||||
def prep_disk_for_backup(destination, disk, backup_prefix):
|
||||
"""Gather details about the disk and its partitions.
|
||||
|
||||
|
|
@ -142,6 +148,7 @@ def prep_disk_for_backup(destination, disk, backup_prefix):
|
|||
COLORS['YELLOW'], COLORS['CLEAR'])
|
||||
disk['Backup Warnings'] = warnings
|
||||
|
||||
|
||||
def select_backup_destination(auto_select=True):
|
||||
"""Select a backup destination from a menu, returns server dict."""
|
||||
destinations = [s for s in BACKUP_SERVERS if s['Mounted']]
|
||||
|
|
@ -151,7 +158,10 @@ def select_backup_destination(auto_select=True):
|
|||
|
||||
# Add local disks
|
||||
for d in psutil.disk_partitions():
|
||||
if re.search(r'^{}'.format(global_vars['Env']['SYSTEMDRIVE']), d.mountpoint, re.IGNORECASE):
|
||||
if re.search(
|
||||
r'^{}'.format(global_vars['Env']['SYSTEMDRIVE']),
|
||||
d.mountpoint,
|
||||
re.IGNORECASE):
|
||||
# Skip current OS drive
|
||||
pass
|
||||
elif 'fixed' in d.opts:
|
||||
|
|
@ -189,6 +199,7 @@ def select_backup_destination(auto_select=True):
|
|||
else:
|
||||
return destinations[int(selection)-1]
|
||||
|
||||
|
||||
def verify_wim_backup(partition):
|
||||
"""Verify WIM integrity."""
|
||||
if not os.path.exists(partition['Image Path']):
|
||||
|
|
@ -201,5 +212,8 @@ def verify_wim_backup(partition):
|
|||
]
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
# Wizard Kit: Functions - Browsers
|
||||
|
||||
from functions.common import *
|
||||
|
||||
from operator import itemgetter
|
||||
|
||||
|
||||
# Define other_results for later try_and_print
|
||||
browser_data = {}
|
||||
other_results = {
|
||||
|
|
@ -16,22 +16,6 @@ other_results = {
|
|||
}
|
||||
}
|
||||
|
||||
# Regex
|
||||
REGEX_BACKUP = re.compile(
|
||||
r'\.\w*bak.*',
|
||||
re.IGNORECASE)
|
||||
REGEX_CHROMIUM_PROFILE = re.compile(
|
||||
r'^(Default|Profile)',
|
||||
re.IGNORECASE)
|
||||
REGEX_CHROMIUM_ITEMS = re.compile(
|
||||
r'^(Bookmarks|Cookies|Favicons|Google Profile'
|
||||
r'|History|Login Data|Top Sites|TransportSecurity'
|
||||
r'|Visited Links|Web Data)',
|
||||
re.IGNORECASE)
|
||||
REGEX_MOZILLA = re.compile(
|
||||
r'^(bookmarkbackups|(cookies|formhistory|places).sqlite'
|
||||
r'|key3.db|logins.json|persdict.dat)$',
|
||||
re.IGNORECASE)
|
||||
|
||||
# STATIC VARIABLES
|
||||
DEFAULT_HOMEPAGE = 'https://www.google.com/'
|
||||
|
|
@ -103,6 +87,25 @@ SUPPORTED_BROWSERS = {
|
|||
},
|
||||
}
|
||||
|
||||
|
||||
# Regex
|
||||
REGEX_BACKUP = re.compile(
|
||||
r'\.\w*bak.*',
|
||||
re.IGNORECASE)
|
||||
REGEX_CHROMIUM_PROFILE = re.compile(
|
||||
r'^(Default|Profile)',
|
||||
re.IGNORECASE)
|
||||
REGEX_CHROMIUM_ITEMS = re.compile(
|
||||
r'^(Bookmarks|Cookies|Favicons|Google Profile'
|
||||
r'|History|Login Data|Top Sites|TransportSecurity'
|
||||
r'|Visited Links|Web Data)',
|
||||
re.IGNORECASE)
|
||||
REGEX_MOZILLA = re.compile(
|
||||
r'^(bookmarkbackups|(cookies|formhistory|places).sqlite'
|
||||
r'|key3.db|logins.json|persdict.dat)$',
|
||||
re.IGNORECASE)
|
||||
|
||||
|
||||
def archive_all_users():
|
||||
"""Create backups for all browsers for all users."""
|
||||
users_root = r'{}\Users'.format(global_vars['Env']['SYSTEMDRIVE'])
|
||||
|
|
@ -149,6 +152,7 @@ def archive_all_users():
|
|||
function=run_program, cmd=cmd)
|
||||
print_standard(' ')
|
||||
|
||||
|
||||
def archive_browser(name):
|
||||
"""Create backup of Browser saved in the BackupDir."""
|
||||
source = '{}*'.format(browser_data[name]['user_data_path'])
|
||||
|
|
@ -163,14 +167,22 @@ def archive_browser(name):
|
|||
archive, source]
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def backup_browsers():
|
||||
"""Create backup of all detected browser profiles."""
|
||||
for name in [k for k, v in sorted(browser_data.items()) if v['profiles']]:
|
||||
try_and_print(message='{}...'.format(name),
|
||||
function=archive_browser, name=name)
|
||||
|
||||
|
||||
def clean_chromium_profile(profile):
|
||||
"""Renames profile, creates a new folder, and copies the user data to it."""
|
||||
"""Recreate profile with only the essential user data.
|
||||
|
||||
This is done by renaming the existing profile, creating a new folder
|
||||
with the original name, then copying the essential files from the
|
||||
backup folder. This way the original state is preserved in case
|
||||
something goes wrong.
|
||||
"""
|
||||
if profile is None:
|
||||
raise Exception
|
||||
backup_path = '{path}_{Date}.bak'.format(
|
||||
|
|
@ -185,6 +197,7 @@ def clean_chromium_profile(profile):
|
|||
shutil.copy(entry.path, r'{}\{}'.format(
|
||||
profile['path'], entry.name))
|
||||
|
||||
|
||||
def clean_internet_explorer(**kwargs):
|
||||
"""Uses the built-in function to reset IE and sets the homepage.
|
||||
|
||||
|
|
@ -202,8 +215,15 @@ def clean_internet_explorer(**kwargs):
|
|||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
|
||||
def clean_mozilla_profile(profile):
|
||||
"""Renames profile, creates a new folder, and copies the user data to it."""
|
||||
"""Recreate profile with only the essential user data.
|
||||
|
||||
This is done by renaming the existing profile, creating a new folder
|
||||
with the original name, then copying the essential files from the
|
||||
backup folder. This way the original state is preserved in case
|
||||
something goes wrong.
|
||||
"""
|
||||
if profile is None:
|
||||
raise Exception
|
||||
backup_path = '{path}_{Date}.bak'.format(
|
||||
|
|
@ -228,8 +248,9 @@ def clean_mozilla_profile(profile):
|
|||
for k, v in MOZILLA_PREFS.items():
|
||||
f.write('user_pref("{}", {});\n'.format(k, v))
|
||||
|
||||
|
||||
def get_browser_details(name):
|
||||
"""Get installation status and profile details for all supported browsers."""
|
||||
"""Get installation and profile details for all supported browsers."""
|
||||
browser = SUPPORTED_BROWSERS[name].copy()
|
||||
|
||||
# Update user_data_path
|
||||
|
|
@ -302,6 +323,7 @@ def get_browser_details(name):
|
|||
elif num_installs > 1 and browser['base'] != 'ie':
|
||||
raise MultipleInstallationsError
|
||||
|
||||
|
||||
def get_chromium_profiles(search_path):
|
||||
"""Find any chromium-style profiles and return as a list of dicts."""
|
||||
profiles = []
|
||||
|
|
@ -318,6 +340,7 @@ def get_chromium_profiles(search_path):
|
|||
|
||||
return profiles
|
||||
|
||||
|
||||
def get_ie_homepages():
|
||||
"""Read homepages from the registry and return as a list."""
|
||||
homepages = []
|
||||
|
|
@ -342,6 +365,7 @@ def get_ie_homepages():
|
|||
homepages = [h.replace('{', '').replace('}', '') for h in homepages]
|
||||
return homepages
|
||||
|
||||
|
||||
def get_mozilla_homepages(prefs_path):
|
||||
"""Read homepages from prefs.js and return as a list."""
|
||||
homepages = []
|
||||
|
|
@ -357,6 +381,7 @@ def get_mozilla_homepages(prefs_path):
|
|||
|
||||
return homepages
|
||||
|
||||
|
||||
def get_mozilla_profiles(search_path, dev=False):
|
||||
"""Find any mozilla-style profiles and return as a list of dicts."""
|
||||
profiles = []
|
||||
|
|
@ -381,6 +406,7 @@ def get_mozilla_profiles(search_path, dev=False):
|
|||
|
||||
return profiles
|
||||
|
||||
|
||||
def install_adblock(indent=8, width=32, just_firefox=False):
|
||||
"""Install adblock for all supported browsers."""
|
||||
for browser in sorted(browser_data):
|
||||
|
|
@ -449,10 +475,11 @@ def install_adblock(indent=8, width=32, just_firefox=False):
|
|||
cs='Done', function=function,
|
||||
cmd=[exe_path, *urls], check=False)
|
||||
|
||||
|
||||
def list_homepages(indent=8, width=32):
|
||||
"""List current homepages for reference."""
|
||||
|
||||
for browser in [k for k, v in sorted(browser_data.items()) if v['exe_path']]:
|
||||
browser_list = [k for k, v in sorted(browser_data.items()) if v['exe_path']]
|
||||
for browser in browser_list:
|
||||
# Skip Chromium-based browsers
|
||||
if browser_data[browser]['base'] == 'chromium':
|
||||
print_info(
|
||||
|
|
@ -479,9 +506,11 @@ def list_homepages(indent=8, width=32):
|
|||
print_standard('{indent}{name:<{width}}{page}'.format(
|
||||
indent=' '*indent, width=width, name=name, page=page))
|
||||
|
||||
|
||||
def reset_browsers(indent=8, width=32):
|
||||
"""Reset all detected browsers to safe defaults."""
|
||||
for browser in [k for k, v in sorted(browser_data.items()) if v['profiles']]:
|
||||
browser_list = [k for k, v in sorted(browser_data.items()) if v['profiles']]
|
||||
for browser in browser_list:
|
||||
print_info('{indent}{name}'.format(indent=' '*indent, name=browser))
|
||||
for profile in browser_data[browser]['profiles']:
|
||||
if browser_data[browser]['base'] == 'chromium':
|
||||
|
|
@ -495,6 +524,7 @@ def reset_browsers(indent=8, width=32):
|
|||
indent=indent, width=width, function=function,
|
||||
other_results=other_results, profile=profile)
|
||||
|
||||
|
||||
def scan_for_browsers(just_firefox=False):
|
||||
"""Scan system for any supported browsers."""
|
||||
for name, details in sorted(SUPPORTED_BROWSERS.items()):
|
||||
|
|
@ -504,5 +534,8 @@ def scan_for_browsers(just_firefox=False):
|
|||
function=get_browser_details, cs='Detected',
|
||||
other_results=other_results, name=name)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
from functions.common import *
|
||||
|
||||
|
||||
def cleanup_adwcleaner():
|
||||
"""Move AdwCleaner folders into the ClientDir."""
|
||||
source_path = r'{SYSTEMDRIVE}\AdwCleaner'.format(**global_vars['Env'])
|
||||
|
|
@ -26,6 +27,7 @@ def cleanup_adwcleaner():
|
|||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(source_path, dest_name)
|
||||
|
||||
|
||||
def cleanup_cbs(dest_folder):
|
||||
"""Safely cleanup a known CBS archive bug under Windows 7.
|
||||
|
||||
|
|
@ -65,6 +67,7 @@ def cleanup_cbs(dest_folder):
|
|||
r'{}\CbsPersist*'.format(temp_folder)]
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def cleanup_desktop():
|
||||
"""Move known backup files and reports into the ClientDir."""
|
||||
dest_folder = r'{LogDir}\Tools'.format(**global_vars)
|
||||
|
|
@ -81,6 +84,7 @@ def cleanup_desktop():
|
|||
# Remove dir if empty
|
||||
delete_empty_folders(dest_folder)
|
||||
|
||||
|
||||
def delete_empty_folders(folder_path):
|
||||
"""Delete all empty folders in path (depth first)."""
|
||||
if not os.path.exists(folder_path) or not os.path.isdir(folder_path):
|
||||
|
|
@ -98,6 +102,7 @@ def delete_empty_folders(folder_path):
|
|||
except OSError:
|
||||
pass
|
||||
|
||||
|
||||
def delete_registry_key(hive, key, recurse=False):
|
||||
"""Delete a registry key and all it's subkeys."""
|
||||
access = winreg.KEY_ALL_ACCESS
|
||||
|
|
@ -117,13 +122,15 @@ def delete_registry_key(hive, key, recurse=False):
|
|||
# Ignore
|
||||
pass
|
||||
|
||||
|
||||
def delete_registry_value(hive, key, value):
|
||||
"""Delete a registry value."""
|
||||
access = winreg.KEY_ALL_ACCESS
|
||||
with winreg.OpenKeyEx(hive, key, 0, access) as k:
|
||||
winreg.DeleteValue(k, value)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=4 sw=4 ts=4
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -14,22 +14,25 @@ except ModuleNotFoundError:
|
|||
if psutil.WINDOWS:
|
||||
raise
|
||||
|
||||
from subprocess import CalledProcessError
|
||||
|
||||
from settings.main import *
|
||||
from settings.tools import *
|
||||
from settings.windows_builds import *
|
||||
from subprocess import CalledProcessError
|
||||
|
||||
|
||||
# Global variables
|
||||
global_vars = {}
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
COLORS = {
|
||||
'CLEAR': '\033[0m',
|
||||
'RED': '\033[31m',
|
||||
'ORANGE': '\033[31;1m',
|
||||
'GREEN': '\033[32m',
|
||||
'YELLOW': '\033[33m',
|
||||
'BLUE': '\033[34m'
|
||||
'BLUE': '\033[34m',
|
||||
'CYAN': '\033[36m',
|
||||
}
|
||||
try:
|
||||
HKU = winreg.HKEY_USERS
|
||||
|
|
@ -40,6 +43,7 @@ except NameError:
|
|||
if psutil.WINDOWS:
|
||||
raise
|
||||
|
||||
|
||||
# Error Classes
|
||||
class BIOSKeyNotFoundError(Exception):
|
||||
pass
|
||||
|
|
@ -83,6 +87,7 @@ class SecureBootNotAvailError(Exception):
|
|||
class SecureBootUnknownError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
# General functions
|
||||
def abort():
|
||||
"""Abort script."""
|
||||
|
|
@ -91,8 +96,9 @@ def abort():
|
|||
pause(prompt='Press Enter to exit... ')
|
||||
exit_script()
|
||||
|
||||
|
||||
def ask(prompt='Kotaero!'):
|
||||
"""Prompt the user with a Y/N question, log answer, and return a bool."""
|
||||
"""Prompt the user with a Y/N question, returns bool."""
|
||||
answer = None
|
||||
prompt = '{} [Y/N]: '.format(prompt)
|
||||
while answer is None:
|
||||
|
|
@ -107,8 +113,9 @@ def ask(prompt='Kotaero!'):
|
|||
print_log(message=message)
|
||||
return answer
|
||||
|
||||
|
||||
def choice(choices, prompt='Kotaero!'):
|
||||
"""Prompt the user with a choice question, log answer, and returns str."""
|
||||
"""Prompt the user with a choice question, returns str."""
|
||||
answer = None
|
||||
choices = [str(c) for c in choices]
|
||||
choices_short = {c[:1].upper(): c for c in choices}
|
||||
|
|
@ -135,6 +142,7 @@ def choice(choices, prompt='Kotaero!'):
|
|||
# Done
|
||||
return answer
|
||||
|
||||
|
||||
def clear_screen():
|
||||
"""Simple wrapper for cls/clear."""
|
||||
if psutil.WINDOWS:
|
||||
|
|
@ -142,6 +150,7 @@ def clear_screen():
|
|||
else:
|
||||
os.system('clear')
|
||||
|
||||
|
||||
def convert_to_bytes(size):
|
||||
"""Convert human-readable size str to bytes and return an int."""
|
||||
size = str(size)
|
||||
|
|
@ -163,6 +172,7 @@ def convert_to_bytes(size):
|
|||
|
||||
return size
|
||||
|
||||
|
||||
def exit_script(return_value=0):
|
||||
"""Exits the script after some cleanup and opens the log (if set)."""
|
||||
# Remove dirs (if empty)
|
||||
|
|
@ -190,6 +200,7 @@ def exit_script(return_value=0):
|
|||
# Exit
|
||||
sys.exit(return_value)
|
||||
|
||||
|
||||
def extract_item(item, filter='', silent=False):
|
||||
"""Extract item from .cbin into .bin."""
|
||||
cmd = [
|
||||
|
|
@ -209,6 +220,7 @@ def extract_item(item, filter='', silent=False):
|
|||
if not silent:
|
||||
print_warning('WARNING: Errors encountered while exctracting data')
|
||||
|
||||
|
||||
def get_process(name=None):
|
||||
"""Get process by name, returns psutil.Process obj."""
|
||||
proc = None
|
||||
|
|
@ -224,8 +236,9 @@ def get_process(name=None):
|
|||
pass
|
||||
return proc
|
||||
|
||||
|
||||
def get_simple_string(prompt='Enter string'):
|
||||
"""Get string from user (minimal allowed character set) and return as str."""
|
||||
"""Get string from user (restricted character set), returns str."""
|
||||
simple_string = None
|
||||
while simple_string is None:
|
||||
_input = input('{}: '.format(prompt))
|
||||
|
|
@ -233,6 +246,7 @@ def get_simple_string(prompt='Enter string'):
|
|||
simple_string = _input.strip()
|
||||
return simple_string
|
||||
|
||||
|
||||
def get_ticket_number():
|
||||
"""Get TicketNumber from user, save in LogDir, and return as str."""
|
||||
if not ENABLED_TICKET_NUMBERS:
|
||||
|
|
@ -249,8 +263,9 @@ def get_ticket_number():
|
|||
f.write(ticket_number)
|
||||
return ticket_number
|
||||
|
||||
|
||||
def human_readable_size(size, decimals=0):
|
||||
"""Convert size in bytes to a human-readable format and return a str."""
|
||||
"""Convert size from bytes to a human-readable format, returns str."""
|
||||
# Prep string formatting
|
||||
width = 3+decimals
|
||||
if decimals > 0:
|
||||
|
|
@ -288,12 +303,14 @@ def human_readable_size(size, decimals=0):
|
|||
return '{size:>{width}.{decimals}f} {units}'.format(
|
||||
size=size, width=width, decimals=decimals, units=units)
|
||||
|
||||
|
||||
def kill_process(name):
|
||||
"""Kill any running caffeine.exe processes."""
|
||||
for proc in psutil.process_iter():
|
||||
if proc.name() == name:
|
||||
proc.kill()
|
||||
|
||||
|
||||
def major_exception():
|
||||
"""Display traceback and exit"""
|
||||
print_error('Major exception')
|
||||
|
|
@ -305,20 +322,22 @@ def major_exception():
|
|||
except GenericAbort:
|
||||
# User declined upload
|
||||
print_warning('Upload: Aborted')
|
||||
sleep(30)
|
||||
sleep(10)
|
||||
except GenericError:
|
||||
# No log file or uploading disabled
|
||||
sleep(30)
|
||||
sleep(10)
|
||||
except:
|
||||
print_error('Upload: NS')
|
||||
sleep(30)
|
||||
sleep(10)
|
||||
else:
|
||||
print_success('Upload: CS')
|
||||
pause('Press Enter to exit...')
|
||||
exit_script(1)
|
||||
|
||||
def menu_select(title='~ Untitled Menu ~',
|
||||
prompt='Please make a selection', secret_exit=False,
|
||||
|
||||
def menu_select(
|
||||
title='[Untitled Menu]',
|
||||
prompt='Please make a selection', secret_actions=[], secret_exit=False,
|
||||
main_entries=[], action_entries=[], disabled_label='DISABLED',
|
||||
spacer=''):
|
||||
"""Display options in a menu and return selected option as a str."""
|
||||
|
|
@ -334,8 +353,10 @@ def menu_select(title='~ Untitled Menu ~',
|
|||
menu_splash = '{}\n{}\n'.format(title, spacer)
|
||||
width = len(str(len(main_entries)))
|
||||
valid_answers = []
|
||||
if (secret_exit):
|
||||
if secret_exit:
|
||||
valid_answers.append('Q')
|
||||
if secret_actions:
|
||||
valid_answers.extend(secret_actions)
|
||||
|
||||
# Add main entries
|
||||
for i in range(len(main_entries)):
|
||||
|
|
@ -367,7 +388,6 @@ def menu_select(title='~ Untitled Menu ~',
|
|||
letter = entry['Letter'].upper(),
|
||||
width = len(str(len(action_entries))),
|
||||
name = entry['Name'])
|
||||
menu_splash += '\n'
|
||||
|
||||
answer = ''
|
||||
|
||||
|
|
@ -378,6 +398,7 @@ def menu_select(title='~ Untitled Menu ~',
|
|||
|
||||
return answer.upper()
|
||||
|
||||
|
||||
def non_clobber_rename(full_path):
|
||||
"""Append suffix to path, if necessary, to avoid clobbering path"""
|
||||
new_path = full_path
|
||||
|
|
@ -388,10 +409,12 @@ def non_clobber_rename(full_path):
|
|||
|
||||
return new_path
|
||||
|
||||
|
||||
def pause(prompt='Press Enter to continue... '):
|
||||
"""Simple pause implementation."""
|
||||
input(prompt)
|
||||
|
||||
|
||||
def ping(addr='google.com'):
|
||||
"""Attempt to ping addr."""
|
||||
cmd = [
|
||||
|
|
@ -401,30 +424,39 @@ def ping(addr='google.com'):
|
|||
addr]
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def popen_program(cmd, pipe=False, minimized=False, shell=False, **kwargs):
|
||||
"""Run program and return a subprocess.Popen object."""
|
||||
startupinfo=None
|
||||
cmd_kwargs = {'args': cmd, 'shell': shell}
|
||||
|
||||
if minimized:
|
||||
startupinfo = subprocess.STARTUPINFO()
|
||||
startupinfo.dwFlags = subprocess.STARTF_USESHOWWINDOW
|
||||
startupinfo.wShowWindow = 6
|
||||
cmd_kwargs['startupinfo'] = startupinfo
|
||||
|
||||
if pipe:
|
||||
popen_obj = subprocess.Popen(cmd, shell=shell, startupinfo=startupinfo,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
else:
|
||||
popen_obj = subprocess.Popen(cmd, shell=shell, startupinfo=startupinfo)
|
||||
cmd_kwargs.update({
|
||||
'stdout': subprocess.PIPE,
|
||||
'stderr': subprocess.PIPE,
|
||||
})
|
||||
|
||||
if 'cwd' in kwargs:
|
||||
cmd_kwargs['cwd'] = kwargs['cwd']
|
||||
|
||||
return subprocess.Popen(**cmd_kwargs)
|
||||
|
||||
return popen_obj
|
||||
|
||||
def print_error(*args, **kwargs):
|
||||
"""Prints message to screen in RED."""
|
||||
print_standard(*args, color=COLORS['RED'], **kwargs)
|
||||
|
||||
|
||||
def print_info(*args, **kwargs):
|
||||
"""Prints message to screen in BLUE."""
|
||||
print_standard(*args, color=COLORS['BLUE'], **kwargs)
|
||||
|
||||
|
||||
def print_standard(message='Generic info',
|
||||
color=None, end='\n', timestamp=True, **kwargs):
|
||||
"""Prints message to screen and log (if set)."""
|
||||
|
|
@ -435,14 +467,17 @@ def print_standard(message='Generic info',
|
|||
print(display_message.format(**COLORS), end=end, **kwargs)
|
||||
print_log(message, end, timestamp)
|
||||
|
||||
|
||||
def print_success(*args, **kwargs):
|
||||
"""Prints message to screen in GREEN."""
|
||||
print_standard(*args, color=COLORS['GREEN'], **kwargs)
|
||||
|
||||
|
||||
def print_warning(*args, **kwargs):
|
||||
"""Prints message to screen in YELLOW."""
|
||||
print_standard(*args, color=COLORS['YELLOW'], **kwargs)
|
||||
|
||||
|
||||
def print_log(message='', end='\n', timestamp=True):
|
||||
"""Writes message to a log if LogFile is set."""
|
||||
time_str = time.strftime("%Y-%m-%d %H%M%z: ") if timestamp else ''
|
||||
|
|
@ -454,32 +489,38 @@ def print_log(message='', end='\n', timestamp=True):
|
|||
line = line,
|
||||
end = end))
|
||||
|
||||
def run_program(cmd, args=[], check=True, pipe=True, shell=False):
|
||||
|
||||
def run_program(cmd, check=True, pipe=True, shell=False, **kwargs):
|
||||
"""Run program and return a subprocess.CompletedProcess object."""
|
||||
if args:
|
||||
# Deprecated so let's raise an exception to find & fix all occurances
|
||||
print_error('ERROR: Using args is no longer supported.')
|
||||
raise Exception
|
||||
cmd = [c for c in cmd if c]
|
||||
if shell:
|
||||
cmd = ' '.join(cmd)
|
||||
|
||||
cmd_kwargs = {'args': cmd, 'check': check, 'shell': shell}
|
||||
|
||||
if pipe:
|
||||
process_return = subprocess.run(cmd, check=check, shell=shell,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
else:
|
||||
process_return = subprocess.run(cmd, check=check, shell=shell)
|
||||
cmd_kwargs.update({
|
||||
'stdout': subprocess.PIPE,
|
||||
'stderr': subprocess.PIPE,
|
||||
})
|
||||
|
||||
return process_return
|
||||
if 'cwd' in kwargs:
|
||||
cmd_kwargs['cwd'] = kwargs['cwd']
|
||||
|
||||
def set_title(title='~Some Title~'):
|
||||
return subprocess.run(**cmd_kwargs)
|
||||
|
||||
|
||||
def set_title(title='[Some Title]'):
|
||||
"""Set title.
|
||||
|
||||
Used for window title and menu titles."""
|
||||
global_vars['Title'] = title
|
||||
os.system('title {}'.format(title))
|
||||
|
||||
def show_data(message='~Some message~', data='~Some data~', indent=8, width=32,
|
||||
|
||||
def show_data(
|
||||
message='[Some message]', data='[Some data]',
|
||||
indent=8, width=32,
|
||||
info=False, warning=False, error=False):
|
||||
"""Display info with formatting."""
|
||||
message = '{indent}{message:<{width}}{data}'.format(
|
||||
|
|
@ -493,10 +534,12 @@ def show_data(message='~Some message~', data='~Some data~', indent=8, width=32,
|
|||
else:
|
||||
print_standard(message)
|
||||
|
||||
|
||||
def sleep(seconds=2):
|
||||
"""Wait for a while."""
|
||||
time.sleep(seconds)
|
||||
|
||||
|
||||
def stay_awake():
|
||||
"""Prevent the system from sleeping or hibernating."""
|
||||
# DISABLED due to VCR2008 dependency
|
||||
|
|
@ -513,6 +556,14 @@ def stay_awake():
|
|||
print_error('ERROR: No caffeine available.')
|
||||
print_warning('Please set the power setting to High Performance.')
|
||||
|
||||
|
||||
def strip_colors(s):
|
||||
"""Remove all ASCII color escapes from string, returns str."""
|
||||
for c in COLORS.values():
|
||||
s = s.replace(c, '')
|
||||
return s
|
||||
|
||||
|
||||
def get_exception(s):
|
||||
"""Get exception by name, returns Exception object."""
|
||||
try:
|
||||
|
|
@ -522,6 +573,7 @@ def get_exception(s):
|
|||
obj = getattr(sys.modules['builtins'], s)
|
||||
return obj
|
||||
|
||||
|
||||
def try_and_print(message='Trying...',
|
||||
function=None, cs='CS', ns='NS', other_results={},
|
||||
catch_all=True, print_return=False, silent_function=True,
|
||||
|
|
@ -535,7 +587,7 @@ def try_and_print(message='Trying...',
|
|||
}
|
||||
The the ExceptionClassNames will be excepted conditions
|
||||
and the result string will be printed in the correct color.
|
||||
catch_all=False will result in unspecified exceptions being re-raised."""
|
||||
catch_all=False will re-raise unspecified exceptions."""
|
||||
err = None
|
||||
out = None
|
||||
w_exceptions = other_results.get('Warning', {}).keys()
|
||||
|
|
@ -578,6 +630,7 @@ def try_and_print(message='Trying...',
|
|||
else:
|
||||
return {'CS': not bool(err), 'Error': err, 'Out': out}
|
||||
|
||||
|
||||
def upload_crash_details():
|
||||
"""Upload log and runtime data to the CRASH_SERVER.
|
||||
|
||||
|
|
@ -589,13 +642,14 @@ def upload_crash_details():
|
|||
if 'LogFile' in global_vars and global_vars['LogFile']:
|
||||
if ask('Upload crash details to {}?'.format(CRASH_SERVER['Name'])):
|
||||
with open(global_vars['LogFile']) as f:
|
||||
data = '''{}
|
||||
#############################
|
||||
Runtime Details:
|
||||
|
||||
sys.argv: {}
|
||||
|
||||
global_vars: {}'''.format(f.read(), sys.argv, global_vars)
|
||||
data = '{}\n'.format(f.read())
|
||||
data += '#############################\n'
|
||||
data += 'Runtime Details:\n\n'
|
||||
data += 'sys.argv: {}\n\n'.format(sys.argv)
|
||||
try:
|
||||
data += generate_global_vars_report()
|
||||
except Exception:
|
||||
data += 'global_vars: {}\n'.format(global_vars)
|
||||
filename = global_vars.get('LogFile', 'Unknown')
|
||||
filename = re.sub(r'.*(\\|/)', '', filename)
|
||||
filename += '.txt'
|
||||
|
|
@ -617,6 +671,7 @@ global_vars: {}'''.format(f.read(), sys.argv, global_vars)
|
|||
# No LogFile defined (or invalid LogFile)
|
||||
raise GenericError
|
||||
|
||||
|
||||
def wait_for_process(name, poll_rate=3):
|
||||
"""Wait for process by name."""
|
||||
running = True
|
||||
|
|
@ -632,9 +687,11 @@ def wait_for_process(name, poll_rate=3):
|
|||
pass
|
||||
sleep(1)
|
||||
|
||||
|
||||
# global_vars functions
|
||||
def init_global_vars():
|
||||
def init_global_vars(silent=False):
|
||||
"""Sets global variables based on system info."""
|
||||
if not silent:
|
||||
print_info('Initializing')
|
||||
if psutil.WINDOWS:
|
||||
os.system('title Wizard Kit')
|
||||
|
|
@ -653,6 +710,10 @@ def init_global_vars():
|
|||
['Clearing collisions...', clean_env_vars],
|
||||
]
|
||||
try:
|
||||
if silent:
|
||||
for f in init_functions:
|
||||
f[1]()
|
||||
else:
|
||||
for f in init_functions:
|
||||
try_and_print(
|
||||
message=f[0], function=f[1],
|
||||
|
|
@ -660,6 +721,7 @@ def init_global_vars():
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
|
||||
def check_os():
|
||||
"""Set OS specific variables."""
|
||||
tmp = {}
|
||||
|
|
@ -688,9 +750,16 @@ def check_os():
|
|||
tmp['Arch'] = 64
|
||||
|
||||
# Get Windows build info
|
||||
build_info = WINDOWS_BUILDS.get(
|
||||
tmp['CurrentBuild'],
|
||||
('Unknown', 'Build {}'.format(tmp['CurrentBuild']), None, None, 'unrecognized'))
|
||||
build_info = WINDOWS_BUILDS.get(tmp['CurrentBuild'], None)
|
||||
if build_info is None:
|
||||
# Not in windows_builds.py
|
||||
build_info = [
|
||||
'Unknown',
|
||||
'Build {}'.format(tmp['CurrentBuild']),
|
||||
None,
|
||||
None,
|
||||
'unrecognized']
|
||||
else:
|
||||
build_info = list(build_info)
|
||||
tmp['Version'] = build_info.pop(0)
|
||||
tmp['Release'] = build_info.pop(0)
|
||||
|
|
@ -715,6 +784,7 @@ def check_os():
|
|||
|
||||
global_vars['OS'] = tmp
|
||||
|
||||
|
||||
def check_tools():
|
||||
"""Set tool variables based on OS bit-depth and tool availability."""
|
||||
if global_vars['OS'].get('Arch', 32) == 64:
|
||||
|
|
@ -727,6 +797,7 @@ def check_tools():
|
|||
global_vars['Tools'] = {k: os.path.join(global_vars['BinDir'], v)
|
||||
for (k, v) in global_vars['Tools'].items()}
|
||||
|
||||
|
||||
def clean_env_vars():
|
||||
"""Remove conflicting global_vars and env variables.
|
||||
|
||||
|
|
@ -735,6 +806,7 @@ def clean_env_vars():
|
|||
for key in global_vars.keys():
|
||||
global_vars['Env'].pop(key, None)
|
||||
|
||||
|
||||
def find_bin():
|
||||
"""Find .bin folder in the cwd or it's parents."""
|
||||
wd = os.getcwd()
|
||||
|
|
@ -751,6 +823,35 @@ def find_bin():
|
|||
raise BinNotFoundError
|
||||
global_vars['BaseDir'] = base
|
||||
|
||||
|
||||
def generate_global_vars_report():
|
||||
"""Build readable string from global_vars, returns str."""
|
||||
report = ['global_vars: {']
|
||||
for k, v in sorted(global_vars.items()):
|
||||
if k == 'Env':
|
||||
continue
|
||||
if isinstance(v, list):
|
||||
report.append(' {}: ['.format(str(k)))
|
||||
for item in v:
|
||||
report.append(' {}'.format(str(v)))
|
||||
report.append(' ]')
|
||||
elif isinstance(v, dict):
|
||||
report.append(' {}: {{'.format(str(k)))
|
||||
for item_k, item_v in sorted(v.items()):
|
||||
report.append(' {:<15} {}'.format(
|
||||
str(item_k)+':', str(item_v)))
|
||||
report.append(' }')
|
||||
else:
|
||||
report.append(' {:<18}{}'.format(str(k)+':', str(v)))
|
||||
report.append(' Env:')
|
||||
for k, v in sorted(global_vars.get('Env', {}).items()):
|
||||
report.append(' {:<15} {}'.format(
|
||||
str(k)+':', str(v)))
|
||||
report.append('}')
|
||||
|
||||
return '\n'.join(report)
|
||||
|
||||
|
||||
def make_tmp_dirs():
|
||||
"""Make temp directories."""
|
||||
os.makedirs(global_vars['BackupDir'], exist_ok=True)
|
||||
|
|
@ -760,6 +861,7 @@ def make_tmp_dirs():
|
|||
os.makedirs(r'{}\Tools'.format(global_vars['LogDir']), exist_ok=True)
|
||||
os.makedirs(global_vars['TmpDir'], exist_ok=True)
|
||||
|
||||
|
||||
def set_common_vars():
|
||||
"""Set common variables."""
|
||||
global_vars['Date'] = time.strftime("%Y-%m-%d")
|
||||
|
|
@ -782,6 +884,7 @@ def set_common_vars():
|
|||
global_vars['TmpDir'] = r'{BinDir}\tmp'.format(
|
||||
**global_vars)
|
||||
|
||||
|
||||
def set_linux_vars():
|
||||
"""Set common variables in a Linux environment.
|
||||
|
||||
|
|
@ -798,12 +901,22 @@ def set_linux_vars():
|
|||
'SevenZip': '7z',
|
||||
}
|
||||
|
||||
|
||||
def set_log_file(log_name):
|
||||
"""Sets global var LogFile and creates path as needed."""
|
||||
folder_path = r'{}\{}'.format(global_vars['LogDir'], KIT_NAME_FULL)
|
||||
log_file = r'{}\{}'.format(folder_path, log_name)
|
||||
folder_path = '{}{}{}'.format(
|
||||
global_vars['LogDir'],
|
||||
os.sep,
|
||||
KIT_NAME_FULL)
|
||||
log_file = '{}{}{}'.format(
|
||||
folder_path,
|
||||
os.sep,
|
||||
log_name)
|
||||
os.makedirs(folder_path, exist_ok=True)
|
||||
global_vars['LogFile'] = log_file
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -3,61 +3,9 @@
|
|||
import ctypes
|
||||
import json
|
||||
|
||||
from functions.common import *
|
||||
from operator import itemgetter
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# Classes
|
||||
class LocalDisk():
|
||||
def __init__(self, disk):
|
||||
self.disk = disk
|
||||
self.name = disk.mountpoint.upper()
|
||||
self.path = self.name
|
||||
def is_dir(self):
|
||||
# Should always be true
|
||||
return True
|
||||
def is_file(self):
|
||||
# Should always be false
|
||||
return False
|
||||
|
||||
class SourceItem():
|
||||
def __init__(self, name, path):
|
||||
self.name = name
|
||||
self.path = path
|
||||
|
||||
# Regex
|
||||
REGEX_EXCL_ITEMS = re.compile(
|
||||
r'^(\.(AppleDB|AppleDesktop|AppleDouble'
|
||||
r'|com\.apple\.timemachine\.supported|dbfseventsd'
|
||||
r'|DocumentRevisions-V100.*|DS_Store|fseventsd|PKInstallSandboxManager'
|
||||
r'|Spotlight.*|SymAV.*|symSchedScanLockxz|TemporaryItems|Trash.*'
|
||||
r'|vol|VolumeIcon\.icns)|desktop\.(ini|.*DB|.*DF)'
|
||||
r'|(hiberfil|pagefile)\.sys|lost\+found|Network\.*Trash\.*Folder'
|
||||
r'|Recycle[dr]|System\.*Volume\.*Information|Temporary\.*Items'
|
||||
r'|Thumbs\.db)$',
|
||||
re.IGNORECASE)
|
||||
REGEX_EXCL_ROOT_ITEMS = re.compile(
|
||||
r'^(boot(mgr|nxt)$|Config.msi'
|
||||
r'|(eula|globdata|install|vc_?red)'
|
||||
r'|.*.sys$|System Volume Information|RECYCLER?|\$Recycle\.bin'
|
||||
r'|\$?Win(dows(.old.*|\.~BT|)$|RE_)|\$GetCurrent|Windows10Upgrade'
|
||||
r'|PerfLogs|Program Files|SYSTEM.SAV'
|
||||
r'|.*\.(esd|swm|wim|dd|map|dmg|image)$)',
|
||||
re.IGNORECASE)
|
||||
REGEX_INCL_ROOT_ITEMS = re.compile(
|
||||
r'^(AdwCleaner|(My\s*|)(Doc(uments?( and Settings|)|s?)|Downloads'
|
||||
r'|Media|Music|Pic(ture|)s?|Vid(eo|)s?)'
|
||||
r'|{prefix}(-?Info|-?Transfer|)'
|
||||
r'|(ProgramData|Recovery|Temp.*|Users)$'
|
||||
r'|.*\.(log|txt|rtf|qb\w*|avi|m4a|m4v|mp4|mkv|jpg|png|tiff?)$)'
|
||||
r''.format(prefix=KIT_NAME_SHORT),
|
||||
re.IGNORECASE)
|
||||
REGEX_WIM_FILE = re.compile(
|
||||
r'\.wim$',
|
||||
re.IGNORECASE)
|
||||
REGEX_WINDOWS_OLD = re.compile(
|
||||
r'^Win(dows|)\.old',
|
||||
re.IGNORECASE)
|
||||
|
||||
# STATIC VARIABLES
|
||||
FAST_COPY_EXCLUDES = [
|
||||
|
|
@ -116,8 +64,65 @@ SEM_FAILCRITICALERRORS = 1
|
|||
SEM_NOOPENFILEERRORBOX = 0x8000
|
||||
SEM_FAIL = SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS
|
||||
|
||||
|
||||
# Regex
|
||||
REGEX_EXCL_ITEMS = re.compile(
|
||||
r'^(\.(AppleDB|AppleDesktop|AppleDouble'
|
||||
r'|com\.apple\.timemachine\.supported|dbfseventsd'
|
||||
r'|DocumentRevisions-V100.*|DS_Store|fseventsd|PKInstallSandboxManager'
|
||||
r'|Spotlight.*|SymAV.*|symSchedScanLockxz|TemporaryItems|Trash.*'
|
||||
r'|vol|VolumeIcon\.icns)|desktop\.(ini|.*DB|.*DF)'
|
||||
r'|(hiberfil|pagefile)\.sys|lost\+found|Network\.*Trash\.*Folder'
|
||||
r'|Recycle[dr]|System\.*Volume\.*Information|Temporary\.*Items'
|
||||
r'|Thumbs\.db)$',
|
||||
re.IGNORECASE)
|
||||
REGEX_EXCL_ROOT_ITEMS = re.compile(
|
||||
r'^(boot(mgr|nxt)$|Config.msi'
|
||||
r'|(eula|globdata|install|vc_?red)'
|
||||
r'|.*.sys$|System Volume Information|RECYCLER?|\$Recycle\.bin'
|
||||
r'|\$?Win(dows(.old.*|\. BT|)$|RE_)|\$GetCurrent|Windows10Upgrade'
|
||||
r'|PerfLogs|Program Files|SYSTEM.SAV'
|
||||
r'|.*\.(esd|swm|wim|dd|map|dmg|image)$)',
|
||||
re.IGNORECASE)
|
||||
REGEX_INCL_ROOT_ITEMS = re.compile(
|
||||
r'^(AdwCleaner|(My\s*|)(Doc(uments?( and Settings|)|s?)|Downloads'
|
||||
r'|Media|Music|Pic(ture|)s?|Vid(eo|)s?)'
|
||||
r'|{prefix}(-?Info|-?Transfer|)'
|
||||
r'|(ProgramData|Recovery|Temp.*|Users)$'
|
||||
r'|.*\.(log|txt|rtf|qb\w*|avi|m4a|m4v|mp4|mkv|jpg|png|tiff?)$)'
|
||||
r''.format(prefix=KIT_NAME_SHORT),
|
||||
re.IGNORECASE)
|
||||
REGEX_WIM_FILE = re.compile(
|
||||
r'\.wim$',
|
||||
re.IGNORECASE)
|
||||
REGEX_WINDOWS_OLD = re.compile(
|
||||
r'^Win(dows|)\.old',
|
||||
re.IGNORECASE)
|
||||
|
||||
|
||||
# Classes
|
||||
class LocalDisk():
|
||||
def __init__(self, disk):
|
||||
self.disk = disk
|
||||
self.name = disk.mountpoint.upper()
|
||||
self.path = self.name
|
||||
def is_dir(self):
|
||||
# Should always be true
|
||||
return True
|
||||
def is_file(self):
|
||||
# Should always be false
|
||||
return False
|
||||
|
||||
|
||||
class SourceItem():
|
||||
def __init__(self, name, path):
|
||||
self.name = name
|
||||
self.path = path
|
||||
|
||||
|
||||
# Functions
|
||||
def cleanup_transfer(dest_path):
|
||||
"""Fix attributes and move extraneous items outside the Transfer folder."""
|
||||
"""Fix attributes and move excluded items to separate folder."""
|
||||
try:
|
||||
# Remove dest_path if empty
|
||||
os.rmdir(dest_path)
|
||||
|
|
@ -153,6 +158,7 @@ def cleanup_transfer(dest_path):
|
|||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def find_core_storage_volumes(device_path=None):
|
||||
"""Try to create block devices for any Apple CoreStorage volumes."""
|
||||
corestorage_uuid = '53746f72-6167-11aa-aa11-00306543ecac'
|
||||
|
|
@ -216,12 +222,14 @@ def find_core_storage_volumes(device_path=None):
|
|||
cmd = ['sudo', 'dmsetup', 'create', name, dmsetup_cmd_file]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
|
||||
def fix_path_sep(path_str):
|
||||
"""Replace non-native and duplicate dir separators, returns str."""
|
||||
return re.sub(r'(\\|/)+', lambda s: os.sep, path_str)
|
||||
|
||||
|
||||
def is_valid_wim_file(item):
|
||||
"""Checks if the provided os.DirEntry is a valid WIM file, returns bool."""
|
||||
"""Checks if the item is a valid WIM file, returns bool."""
|
||||
valid = bool(item.is_file() and REGEX_WIM_FILE.search(item.name))
|
||||
if valid:
|
||||
extract_item('wimlib', silent=True)
|
||||
|
|
@ -233,13 +241,14 @@ def is_valid_wim_file(item):
|
|||
print_log('WARNING: Image "{}" damaged.'.format(item.name))
|
||||
return valid
|
||||
|
||||
|
||||
def get_mounted_volumes():
|
||||
"""Get mounted volumes, returns dict."""
|
||||
cmd = [
|
||||
'findmnt', '-J', '-b', '-i',
|
||||
'-t', (
|
||||
'autofs,binfmt_misc,bpf,cgroup,cgroup2,configfs,debugfs,devpts,devtmpfs,'
|
||||
'hugetlbfs,mqueue,proc,pstore,securityfs,sysfs,tmpfs'
|
||||
'autofs,binfmt_misc,bpf,cgroup,cgroup2,configfs,debugfs,devpts,'
|
||||
'devtmpfs,hugetlbfs,mqueue,proc,pstore,securityfs,sysfs,tmpfs'
|
||||
),
|
||||
'-o', 'SOURCE,TARGET,FSTYPE,LABEL,SIZE,AVAIL,USED']
|
||||
result = run_program(cmd)
|
||||
|
|
@ -250,6 +259,7 @@ def get_mounted_volumes():
|
|||
mounted_volumes.extend(item.get('children', []))
|
||||
return {item['source']: item for item in mounted_volumes}
|
||||
|
||||
|
||||
def mount_volumes(
|
||||
all_devices=True, device_path=None,
|
||||
read_write=False, core_storage=True):
|
||||
|
|
@ -342,6 +352,7 @@ def mount_volumes(
|
|||
|
||||
return report
|
||||
|
||||
|
||||
def mount_backup_shares(read_write=False):
|
||||
"""Mount the backup shares unless labeled as already mounted."""
|
||||
if psutil.LINUX:
|
||||
|
|
@ -363,6 +374,7 @@ def mount_backup_shares(read_write=False):
|
|||
|
||||
mount_network_share(server, read_write)
|
||||
|
||||
|
||||
def mount_network_share(server, read_write=False):
|
||||
"""Mount a network share defined by server."""
|
||||
if read_write:
|
||||
|
|
@ -415,6 +427,7 @@ def mount_network_share(server, read_write=False):
|
|||
print_info(success)
|
||||
server['Mounted'] = True
|
||||
|
||||
|
||||
def run_fast_copy(items, dest):
|
||||
"""Copy items to dest using FastCopy."""
|
||||
if not items:
|
||||
|
|
@ -427,6 +440,7 @@ def run_fast_copy(items, dest):
|
|||
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def run_wimextract(source, items, dest):
|
||||
"""Extract items from source WIM to dest folder."""
|
||||
if not items:
|
||||
|
|
@ -452,8 +466,9 @@ def run_wimextract(source, items, dest):
|
|||
'--nullglob']
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def list_source_items(source_obj, rel_path=None):
|
||||
"""List items in a dir or WIM, returns a list of SourceItem objects."""
|
||||
"""List items in a dir or WIM, returns list of SourceItem objects."""
|
||||
items = []
|
||||
rel_path = '{}{}'.format(os.sep, rel_path) if rel_path else ''
|
||||
if source_obj.is_dir():
|
||||
|
|
@ -489,6 +504,7 @@ def list_source_items(source_obj, rel_path=None):
|
|||
# Done
|
||||
return items
|
||||
|
||||
|
||||
def scan_source(source_obj, dest_path, rel_path='', interactive=True):
|
||||
"""Scan source for files/folders to transfer, returns list.
|
||||
|
||||
|
|
@ -572,8 +588,9 @@ def scan_source(source_obj, dest_path, rel_path='', interactive=True):
|
|||
# Done
|
||||
return selected_items
|
||||
|
||||
|
||||
def get_source_item_obj(source_obj, rel_path, item_path):
|
||||
"""Check if the item exists and return a SourceItem object if it does."""
|
||||
"""Check if the item exists, returns SourceItem object or None."""
|
||||
item_obj = None
|
||||
item_path = fix_path_sep(item_path)
|
||||
if source_obj.is_dir():
|
||||
|
|
@ -611,6 +628,7 @@ def get_source_item_obj(source_obj, rel_path, item_path):
|
|||
item_path))
|
||||
return item_obj
|
||||
|
||||
|
||||
def select_destination(folder_path, prompt='Select destination'):
|
||||
"""Select destination drive, returns path as string."""
|
||||
disk = select_volume(prompt)
|
||||
|
|
@ -627,8 +645,9 @@ def select_destination(folder_path, prompt='Select destination'):
|
|||
|
||||
return path
|
||||
|
||||
|
||||
def select_source(backup_prefix):
|
||||
"""Select backup from those found on the BACKUP_SERVERS matching the prefix."""
|
||||
"""Select matching backup from BACKUP_SERVERS, returns obj."""
|
||||
selected_source = None
|
||||
local_sources = []
|
||||
remote_sources = []
|
||||
|
|
@ -792,6 +811,7 @@ def select_source(backup_prefix):
|
|||
# Done
|
||||
return selected_source
|
||||
|
||||
|
||||
def select_volume(title='Select disk', auto_select=True):
|
||||
"""Select disk from attached disks. returns dict."""
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
|
|
@ -829,10 +849,11 @@ def select_volume(title='Select disk', auto_select=True):
|
|||
else:
|
||||
return disks[int(selection)-1]
|
||||
|
||||
|
||||
def set_thread_error_mode(silent=True):
|
||||
"""Disable or Enable Windows error message dialogs.
|
||||
|
||||
Disable when scanning for disks to avoid popups for empty cardreaders, etc
|
||||
Disable when scanning disks to avoid popups for empty cardreaders, etc
|
||||
"""
|
||||
# Code borrowed from: https://stackoverflow.com/a/29075319
|
||||
kernel32 = ctypes.WinDLL('kernel32')
|
||||
|
|
@ -842,6 +863,7 @@ def set_thread_error_mode(silent=True):
|
|||
else:
|
||||
kernel32.SetThreadErrorMode(SEM_NORMAL, ctypes.byref(SEM_NORMAL))
|
||||
|
||||
|
||||
def transfer_source(source_obj, dest_path, selected_items):
|
||||
"""Transfer, or extract, files/folders from source to destination."""
|
||||
if source_obj.is_dir():
|
||||
|
|
@ -864,11 +886,13 @@ def transfer_source(source_obj, dest_path, selected_items):
|
|||
print_error('ERROR: Unsupported image: {}'.format(source_obj.path))
|
||||
raise GenericError
|
||||
|
||||
|
||||
def umount_backup_shares():
|
||||
"""Unmount the backup shares regardless of current status."""
|
||||
for server in BACKUP_SERVERS:
|
||||
umount_network_share(server)
|
||||
|
||||
|
||||
def umount_network_share(server):
|
||||
"""Unmount a network share defined by server."""
|
||||
cmd = r'net use \\{IP}\{Share} /delete'.format(**server)
|
||||
|
|
@ -882,5 +906,8 @@ def umount_network_share(server):
|
|||
print_info('Umounted {Name}'.format(**server))
|
||||
server['Mounted'] = False
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -8,10 +8,13 @@ import signal
|
|||
import stat
|
||||
import time
|
||||
|
||||
from functions.common import *
|
||||
from collections import OrderedDict
|
||||
from functions.data import *
|
||||
from functions.hw_diags import *
|
||||
from functions.tmux import *
|
||||
from operator import itemgetter
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
AUTO_PASS_1_THRESHOLD = 95
|
||||
AUTO_PASS_2_THRESHOLD = 98
|
||||
|
|
@ -30,6 +33,11 @@ DDRESCUE_SETTINGS = {
|
|||
}
|
||||
RECOMMENDED_FSTYPES = ['ext3', 'ext4', 'xfs']
|
||||
SIDE_PANE_WIDTH = 21
|
||||
TMUX_LAYOUT = OrderedDict({
|
||||
'Source': {'y': 2, 'Check': True},
|
||||
'Started': {'x': SIDE_PANE_WIDTH, 'Check': True},
|
||||
'Progress': {'x': SIDE_PANE_WIDTH, 'Check': True},
|
||||
})
|
||||
USAGE = """ {script_name} clone [source [destination]]
|
||||
{script_name} image [source [destination]]
|
||||
(e.g. {script_name} clone /dev/sda /dev/sdb)
|
||||
|
|
@ -247,7 +255,7 @@ class ImageObj(BaseObj):
|
|||
self.path))
|
||||
|
||||
def set_details(self):
|
||||
"""Setup loopback device, set details via lsblk, then detach device."""
|
||||
"""Set details using a temp loopback device."""
|
||||
self.type = 'image'
|
||||
self.loop_dev = setup_loopback_device(self.path)
|
||||
self.details = get_device_details(self.loop_dev)
|
||||
|
|
@ -276,6 +284,7 @@ class RecoveryState():
|
|||
self.current_pass_str = '0: Initializing'
|
||||
self.settings = DDRESCUE_SETTINGS.copy()
|
||||
self.finished = False
|
||||
self.panes = {}
|
||||
self.progress_out = '{}/progress.out'.format(global_vars['LogDir'])
|
||||
self.rescued = 0
|
||||
self.resumed = False
|
||||
|
|
@ -283,6 +292,7 @@ class RecoveryState():
|
|||
self.total_size = 0
|
||||
if mode not in ('clone', 'image'):
|
||||
raise GenericError('Unsupported mode')
|
||||
self.get_smart_source()
|
||||
|
||||
def add_block_pair(self, source, dest):
|
||||
"""Run safety checks and append new BlockPair to internal list."""
|
||||
|
|
@ -341,6 +351,14 @@ class RecoveryState():
|
|||
min_percent = min(min_percent, bp.rescued_percent)
|
||||
return min_percent
|
||||
|
||||
def get_smart_source(self):
|
||||
"""Get source for SMART dispay."""
|
||||
disk_path = self.source.path
|
||||
if self.source.parent:
|
||||
disk_path = self.source.parent
|
||||
|
||||
self.smart_source = DiskObj(disk_path)
|
||||
|
||||
def retry_all_passes(self):
|
||||
"""Mark all passes as pending for all block-pairs."""
|
||||
self.finished = False
|
||||
|
|
@ -351,7 +369,34 @@ class RecoveryState():
|
|||
self.set_pass_num()
|
||||
|
||||
def self_checks(self):
|
||||
"""Run self-checks for each BlockPair and update state values."""
|
||||
"""Run self-checks and update state values."""
|
||||
cmd = ['findmnt', '--json', '--target', os.getcwd()]
|
||||
map_allowed_fstypes = RECOMMENDED_FSTYPES.copy()
|
||||
map_allowed_fstypes.extend(['cifs', 'ext2', 'vfat'])
|
||||
map_allowed_fstypes.sort()
|
||||
json_data = {}
|
||||
|
||||
# Avoid saving map to non-persistent filesystem
|
||||
try:
|
||||
result = run_program(cmd)
|
||||
json_data = json.loads(result.stdout.decode())
|
||||
except Exception:
|
||||
print_error('ERROR: Failed to verify map path')
|
||||
raise GenericAbort()
|
||||
fstype = json_data.get(
|
||||
'filesystems', [{}])[0].get(
|
||||
'fstype', 'unknown')
|
||||
if fstype not in map_allowed_fstypes:
|
||||
print_error(
|
||||
"Map isn't being saved to a recommended filesystem ({})".format(
|
||||
fstype.upper()))
|
||||
print_info('Recommended types are: {}'.format(
|
||||
' / '.join(map_allowed_fstypes).upper()))
|
||||
print_standard(' ')
|
||||
if not ask('Proceed anyways? (Strongly discouraged)'):
|
||||
raise GenericAbort()
|
||||
|
||||
# Run BlockPair self checks and get total size
|
||||
self.total_size = 0
|
||||
for bp in self.block_pairs:
|
||||
bp.self_check()
|
||||
|
|
@ -398,46 +443,22 @@ class RecoveryState():
|
|||
# Functions
|
||||
def build_outer_panes(state):
|
||||
"""Build top and side panes."""
|
||||
clear_screen()
|
||||
result = run_program(['tput', 'cols'])
|
||||
width = int(
|
||||
(int(result.stdout.decode().strip()) - SIDE_PANE_WIDTH) / 2) - 2
|
||||
|
||||
# Top panes
|
||||
source_str = state.source.name
|
||||
if len(source_str) > width:
|
||||
source_str = '{}...'.format(source_str[:width-3])
|
||||
dest_str = state.dest.name
|
||||
if len(dest_str) > width:
|
||||
if state.mode == 'clone':
|
||||
dest_str = '{}...'.format(dest_str[:width-3])
|
||||
else:
|
||||
dest_str = '...{}'.format(dest_str[-width+3:])
|
||||
source_pane = tmux_splitw(
|
||||
'-bdvl', '2',
|
||||
'-PF', '#D',
|
||||
'echo-and-hold "{BLUE}Source{CLEAR}\n{text}"'.format(
|
||||
text=source_str,
|
||||
**COLORS))
|
||||
tmux_splitw(
|
||||
'-t', source_pane,
|
||||
'-dhl', '{}'.format(SIDE_PANE_WIDTH),
|
||||
'echo-and-hold "{BLUE}Started{CLEAR}\n{text}"'.format(
|
||||
text=time.strftime("%Y-%m-%d %H:%M %Z"),
|
||||
**COLORS))
|
||||
tmux_splitw(
|
||||
'-t', source_pane,
|
||||
'-dhp', '50',
|
||||
'echo-and-hold "{BLUE}Destination{CLEAR}\n{text}"'.format(
|
||||
text=dest_str,
|
||||
state.panes['Source'] = tmux_split_window(
|
||||
behind=True, vertical=True, lines=2,
|
||||
text='{BLUE}Source{CLEAR}'.format(**COLORS))
|
||||
state.panes['Started'] = tmux_split_window(
|
||||
lines=SIDE_PANE_WIDTH, target_pane=state.panes['Source'],
|
||||
text='{BLUE}Started{CLEAR}\n{s}'.format(
|
||||
s=time.strftime("%Y-%m-%d %H:%M %Z"),
|
||||
**COLORS))
|
||||
state.panes['Destination'] = tmux_split_window(
|
||||
percent=50, target_pane=state.panes['Source'],
|
||||
text='{BLUE}Destination{CLEAR}'.format(**COLORS))
|
||||
|
||||
# Side pane
|
||||
update_sidepane(state)
|
||||
tmux_splitw(
|
||||
'-dhl', str(SIDE_PANE_WIDTH),
|
||||
'watch', '--color', '--no-title', '--interval', '1',
|
||||
'cat', state.progress_out)
|
||||
state.panes['Progress'] = tmux_split_window(
|
||||
lines=SIDE_PANE_WIDTH, watch=state.progress_out)
|
||||
|
||||
|
||||
def create_path_obj(path):
|
||||
|
|
@ -455,7 +476,7 @@ def create_path_obj(path):
|
|||
|
||||
|
||||
def double_confirm_clone():
|
||||
"""Display warning and get 2nd confirmation from user, returns bool."""
|
||||
"""Display warning and get 2nd confirmation, returns bool."""
|
||||
print_standard('\nSAFETY CHECK')
|
||||
print_warning('All data will be DELETED from the '
|
||||
'destination device and partition(s) listed above.')
|
||||
|
|
@ -464,6 +485,94 @@ def double_confirm_clone():
|
|||
return ask('Asking again to confirm, is this correct?')
|
||||
|
||||
|
||||
def fix_tmux_panes(state, forced=False):
|
||||
"""Fix pane sizes if the winodw has been resized."""
|
||||
needs_fixed = False
|
||||
|
||||
# Check layout
|
||||
for k, v in TMUX_LAYOUT.items():
|
||||
if not v.get('Check'):
|
||||
# Not concerned with the size of this pane
|
||||
continue
|
||||
# Get target
|
||||
target = None
|
||||
if k != 'Current':
|
||||
if k not in state.panes:
|
||||
# Skip missing panes
|
||||
continue
|
||||
else:
|
||||
target = state.panes[k]
|
||||
|
||||
# Check pane size
|
||||
x, y = tmux_get_pane_size(pane_id=target)
|
||||
if v.get('x', False) and v['x'] != x:
|
||||
needs_fixed = True
|
||||
if v.get('y', False) and v['y'] != y:
|
||||
needs_fixed = True
|
||||
|
||||
# Bail?
|
||||
if not needs_fixed and not forced:
|
||||
return
|
||||
|
||||
# Remove Destination pane (temporarily)
|
||||
tmux_kill_pane(state.panes['Destination'])
|
||||
|
||||
# Update layout
|
||||
for k, v in TMUX_LAYOUT.items():
|
||||
# Get target
|
||||
target = None
|
||||
if k != 'Current':
|
||||
if k not in state.panes:
|
||||
# Skip missing panes
|
||||
continue
|
||||
else:
|
||||
target = state.panes[k]
|
||||
|
||||
# Resize pane
|
||||
tmux_resize_pane(pane_id=target, **v)
|
||||
|
||||
# Calc Source/Destination pane sizes
|
||||
width, height = tmux_get_pane_size()
|
||||
width = int(width / 2) - 1
|
||||
|
||||
# Update Source string
|
||||
source_str = state.source.name
|
||||
if len(source_str) > width:
|
||||
source_str = '{}...'.format(source_str[:width-3])
|
||||
|
||||
# Update Destination string
|
||||
dest_str = state.dest.name
|
||||
if len(dest_str) > width:
|
||||
if state.mode == 'clone':
|
||||
dest_str = '{}...'.format(dest_str[:width-3])
|
||||
else:
|
||||
dest_str = '...{}'.format(dest_str[-width+3:])
|
||||
|
||||
# Rebuild Source/Destination panes
|
||||
tmux_update_pane(
|
||||
pane_id=state.panes['Source'],
|
||||
text='{BLUE}Source{CLEAR}\n{s}'.format(
|
||||
s=source_str, **COLORS))
|
||||
state.panes['Destination'] = tmux_split_window(
|
||||
percent=50, target_pane=state.panes['Source'],
|
||||
text='{BLUE}Destination{CLEAR}\n{s}'.format(
|
||||
s=dest_str, **COLORS))
|
||||
|
||||
if 'SMART' in state.panes:
|
||||
# Calc SMART/ddrescue/Journal panes sizes
|
||||
ratio = [12, 22, 4]
|
||||
width, height = tmux_get_pane_size(pane_id=state.panes['Progress'])
|
||||
height -= 2
|
||||
total = sum(ratio)
|
||||
p_ratio = [int((x/total) * height) for x in ratio]
|
||||
p_ratio[1] = height - p_ratio[0] - p_ratio[2]
|
||||
|
||||
# Resize SMART/Journal panes
|
||||
tmux_resize_pane(state.panes['SMART'], y=ratio[0])
|
||||
tmux_resize_pane(y=ratio[1])
|
||||
tmux_resize_pane(state.panes['Journal'], y=ratio[2])
|
||||
|
||||
|
||||
def get_device_details(dev_path):
|
||||
"""Get device details via lsblk, returns JSON dict."""
|
||||
try:
|
||||
|
|
@ -660,15 +769,21 @@ def menu_ddrescue(source_path, dest_path, run_mode):
|
|||
raise GenericAbort()
|
||||
|
||||
# Main menu
|
||||
clear_screen()
|
||||
build_outer_panes(state)
|
||||
fix_tmux_panes(state, forced=True)
|
||||
menu_main(state)
|
||||
|
||||
# Done
|
||||
run_program(['tmux', 'kill-window'])
|
||||
exit_script()
|
||||
|
||||
|
||||
def menu_main(state):
|
||||
"""Main menu is used to set ddrescue settings."""
|
||||
checkmark = '*'
|
||||
if 'DISPLAY' in global_vars['Env']:
|
||||
checkmark = '✓'
|
||||
title = '{GREEN}ddrescue TUI: Main Menu{CLEAR}\n\n'.format(**COLORS)
|
||||
title += '{BLUE}Current pass: {CLEAR}'.format(**COLORS)
|
||||
|
||||
|
|
@ -692,8 +807,8 @@ def menu_main(state):
|
|||
while True:
|
||||
# Update entries
|
||||
for opt in main_options:
|
||||
opt['Name'] = '{} {}'.format(
|
||||
'[✓]' if opt['Enabled'] else '[ ]',
|
||||
opt['Name'] = '[{}] {}'.format(
|
||||
checkmark if opt['Enabled'] else ' ',
|
||||
opt['Base Name'])
|
||||
|
||||
selection = menu_select(
|
||||
|
|
@ -842,7 +957,8 @@ def read_map_file(map_path):
|
|||
|
||||
def run_ddrescue(state, pass_settings):
|
||||
"""Run ddrescue pass."""
|
||||
return_code = None
|
||||
return_code = -1
|
||||
aborted = False
|
||||
|
||||
if state.finished:
|
||||
clear_screen()
|
||||
|
|
@ -850,29 +966,21 @@ def run_ddrescue(state, pass_settings):
|
|||
pause('Press Enter to return to main menu...')
|
||||
return
|
||||
|
||||
# Set heights
|
||||
# NOTE: 12/33 is based on min heights for SMART/ddrescue panes (12+22+1sep)
|
||||
result = run_program(['tput', 'lines'])
|
||||
height = int(result.stdout.decode().strip())
|
||||
height_smart = int(height * (8 / 33))
|
||||
height_journal = int(height * (4 / 33))
|
||||
height_ddrescue = height - height_smart - height_journal
|
||||
|
||||
# Show SMART status
|
||||
smart_dev = state.source_path
|
||||
if state.source.parent:
|
||||
smart_dev = state.source.parent
|
||||
smart_pane = tmux_splitw(
|
||||
'-bdvl', str(height_smart),
|
||||
'-PF', '#D',
|
||||
'watch', '--color', '--no-title', '--interval', '300',
|
||||
'ddrescue-tui-smart-display', smart_dev)
|
||||
# Create SMART monitor pane
|
||||
state.smart_out = '{}/smart_{}.out'.format(
|
||||
global_vars['TmpDir'], state.smart_source.name)
|
||||
with open(state.smart_out, 'w') as f:
|
||||
f.write('Initializing...')
|
||||
state.panes['SMART'] = tmux_split_window(
|
||||
behind=True, lines=12, vertical=True, watch=state.smart_out)
|
||||
|
||||
# Show systemd journal output
|
||||
journal_pane = tmux_splitw(
|
||||
'-dvl', str(height_journal),
|
||||
'-PF', '#D',
|
||||
'journalctl', '-f')
|
||||
state.panes['Journal'] = tmux_split_window(
|
||||
lines=4, vertical=True,
|
||||
command=['sudo', 'journalctl', '-f'])
|
||||
|
||||
# Fix layout
|
||||
fix_tmux_panes(state, forced=True)
|
||||
|
||||
# Run pass for each block-pair
|
||||
for bp in state.block_pairs:
|
||||
|
|
@ -901,21 +1009,40 @@ def run_ddrescue(state, pass_settings):
|
|||
clear_screen()
|
||||
print_info('Current dev: {}'.format(bp.source_path))
|
||||
ddrescue_proc = popen_program(cmd)
|
||||
i = 0
|
||||
while True:
|
||||
# Update SMART display (every 30 seconds)
|
||||
if i % 30 == 0:
|
||||
state.smart_source.get_smart_details()
|
||||
with open(state.smart_out, 'w') as f:
|
||||
report = state.smart_source.generate_attribute_report(
|
||||
timestamp=True)
|
||||
for line in report:
|
||||
f.write('{}\n'.format(line))
|
||||
i += 1
|
||||
|
||||
# Update progress
|
||||
bp.update_progress(state.current_pass)
|
||||
update_sidepane(state)
|
||||
|
||||
# Fix panes
|
||||
fix_tmux_panes(state)
|
||||
|
||||
# Check if ddrescue has finished
|
||||
try:
|
||||
ddrescue_proc.wait(timeout=10)
|
||||
ddrescue_proc.wait(timeout=1)
|
||||
sleep(2)
|
||||
bp.update_progress(state.current_pass)
|
||||
update_sidepane(state)
|
||||
break
|
||||
except subprocess.TimeoutExpired:
|
||||
# Catch to update bp/sidepane
|
||||
# Catch to update smart/bp/sidepane
|
||||
pass
|
||||
|
||||
except KeyboardInterrupt:
|
||||
# Catch user abort
|
||||
pass
|
||||
aborted = True
|
||||
ddrescue_proc.wait(timeout=10)
|
||||
|
||||
# Update progress/sidepane again
|
||||
bp.update_progress(state.current_pass)
|
||||
|
|
@ -923,12 +1050,19 @@ def run_ddrescue(state, pass_settings):
|
|||
|
||||
# Was ddrescue aborted?
|
||||
return_code = ddrescue_proc.poll()
|
||||
if return_code is None or return_code is 130:
|
||||
clear_screen()
|
||||
if aborted:
|
||||
print_standard(' ')
|
||||
print_standard(' ')
|
||||
print_error('DDRESCUE PROCESS HALTED')
|
||||
print_standard(' ')
|
||||
print_warning('Aborted')
|
||||
break
|
||||
elif return_code:
|
||||
# i.e. not None and not 0
|
||||
# i.e. True when non-zero
|
||||
print_standard(' ')
|
||||
print_standard(' ')
|
||||
print_error('DDRESCUE PROCESS HALTED')
|
||||
print_standard(' ')
|
||||
print_error('Error(s) encountered, see message above.')
|
||||
break
|
||||
else:
|
||||
|
|
@ -940,8 +1074,9 @@ def run_ddrescue(state, pass_settings):
|
|||
if str(return_code) != '0':
|
||||
# Pause on errors
|
||||
pause('Press Enter to return to main menu... ')
|
||||
run_program(['tmux', 'kill-pane', '-t', smart_pane])
|
||||
run_program(['tmux', 'kill-pane', '-t', journal_pane])
|
||||
|
||||
# Cleanup
|
||||
tmux_kill_pane(state.panes['SMART'], state.panes['Journal'])
|
||||
|
||||
|
||||
def select_parts(source_device):
|
||||
|
|
@ -1152,7 +1287,7 @@ def select_device(description='device', skip_device=None):
|
|||
|
||||
|
||||
def setup_loopback_device(source_path):
|
||||
"""Setup a loopback device for source_path, returns dev_path as str."""
|
||||
"""Setup loopback device for source_path, returns dev_path as str."""
|
||||
cmd = (
|
||||
'losetup',
|
||||
'--find',
|
||||
|
|
@ -1192,13 +1327,6 @@ def show_usage(script_name):
|
|||
pause()
|
||||
|
||||
|
||||
def tmux_splitw(*args):
|
||||
"""Run tmux split-window command and return output as str."""
|
||||
cmd = ['tmux', 'split-window', *args]
|
||||
result = run_program(cmd)
|
||||
return result.stdout.decode().strip()
|
||||
|
||||
|
||||
def update_sidepane(state):
|
||||
"""Update progress file for side pane."""
|
||||
output = []
|
||||
|
|
@ -1236,4 +1364,4 @@ def update_sidepane(state):
|
|||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=4 sw=4 ts=4
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -1,189 +0,0 @@
|
|||
# Wizard Kit: Functions - Diagnostics
|
||||
|
||||
import ctypes
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# STATIC VARIABLES
|
||||
AUTORUNS_SETTINGS = {
|
||||
r'Software\Sysinternals\AutoRuns': {
|
||||
'checkvirustotal': 1,
|
||||
'EulaAccepted': 1,
|
||||
'shownomicrosoft': 1,
|
||||
'shownowindows': 1,
|
||||
'showonlyvirustotal': 1,
|
||||
'submitvirustotal': 0,
|
||||
'verifysignatures': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\SigCheck': {
|
||||
'EulaAccepted': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\Streams': {
|
||||
'EulaAccepted': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\VirusTotal': {
|
||||
'VirusTotalTermsAccepted': 1,
|
||||
},
|
||||
}
|
||||
|
||||
def check_connection():
|
||||
"""Check if the system is online and optionally abort the script."""
|
||||
while True:
|
||||
result = try_and_print(message='Ping test...', function=ping, cs='OK')
|
||||
if result['CS']:
|
||||
break
|
||||
if not ask('ERROR: System appears offline, try again?'):
|
||||
if ask('Continue anyway?'):
|
||||
break
|
||||
else:
|
||||
abort()
|
||||
|
||||
def check_secure_boot_status(show_alert=False):
|
||||
"""Checks UEFI Secure Boot status via PowerShell."""
|
||||
boot_mode = get_boot_mode()
|
||||
cmd = ['PowerShell', '-Command', 'Confirm-SecureBootUEFI']
|
||||
result = run_program(cmd, check=False)
|
||||
|
||||
# Check results
|
||||
if result.returncode == 0:
|
||||
out = result.stdout.decode()
|
||||
if 'True' in out:
|
||||
# It's on, do nothing
|
||||
return
|
||||
elif 'False' in out:
|
||||
if show_alert:
|
||||
show_alert_box('Secure Boot DISABLED')
|
||||
raise SecureBootDisabledError
|
||||
else:
|
||||
if show_alert:
|
||||
show_alert_box('Secure Boot status UNKNOWN')
|
||||
raise SecureBootUnknownError
|
||||
else:
|
||||
if boot_mode != 'UEFI':
|
||||
if (show_alert and
|
||||
global_vars['OS']['Version'] in ('8', '8.1', '10')):
|
||||
# OS supports Secure Boot
|
||||
show_alert_box('Secure Boot DISABLED\n\nOS installed LEGACY')
|
||||
raise OSInstalledLegacyError
|
||||
else:
|
||||
# Check error message
|
||||
err = result.stderr.decode()
|
||||
if 'Cmdlet not supported' in err:
|
||||
if show_alert:
|
||||
show_alert_box('Secure Boot UNAVAILABLE?')
|
||||
raise SecureBootNotAvailError
|
||||
else:
|
||||
if show_alert:
|
||||
show_alert_box('Secure Boot ERROR')
|
||||
raise GenericError
|
||||
|
||||
def get_boot_mode():
|
||||
"""Check if Windows is booted in UEFI or Legacy mode, returns str."""
|
||||
kernel = ctypes.windll.kernel32
|
||||
firmware_type = ctypes.c_uint()
|
||||
|
||||
# Get value from kernel32 API
|
||||
try:
|
||||
kernel.GetFirmwareType(ctypes.byref(firmware_type))
|
||||
except:
|
||||
# Just set to zero
|
||||
firmware_type = ctypes.c_uint(0)
|
||||
|
||||
# Set return value
|
||||
type_str = 'Unknown'
|
||||
if firmware_type.value == 1:
|
||||
type_str = 'Legacy'
|
||||
elif firmware_type.value == 2:
|
||||
type_str = 'UEFI'
|
||||
|
||||
return type_str
|
||||
|
||||
def run_autoruns():
|
||||
"""Run AutoRuns in the background with VirusTotal checks enabled."""
|
||||
extract_item('Autoruns', filter='autoruns*', silent=True)
|
||||
# Update AutoRuns settings before running
|
||||
for path, settings in AUTORUNS_SETTINGS.items():
|
||||
winreg.CreateKey(HKCU, path)
|
||||
with winreg.OpenKey(HKCU, path, access=winreg.KEY_WRITE) as key:
|
||||
for name, value in settings.items():
|
||||
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
|
||||
popen_program(global_vars['Tools']['AutoRuns'], minimized=True)
|
||||
|
||||
def run_hwinfo_sensors():
|
||||
"""Run HWiNFO sensors."""
|
||||
path = r'{BinDir}\HWiNFO'.format(**global_vars)
|
||||
for bit in [32, 64]:
|
||||
# Configure
|
||||
source = r'{}\general.ini'.format(path)
|
||||
dest = r'{}\HWiNFO{}.ini'.format(path, bit)
|
||||
shutil.copy(source, dest)
|
||||
with open(dest, 'a') as f:
|
||||
f.write('SensorsOnly=1\n')
|
||||
f.write('SummaryOnly=0\n')
|
||||
popen_program(global_vars['Tools']['HWiNFO'])
|
||||
|
||||
def run_nircmd(*cmd):
|
||||
"""Run custom NirCmd."""
|
||||
extract_item('NirCmd', silent=True)
|
||||
cmd = [global_vars['Tools']['NirCmd'], *cmd]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
def run_xmplay():
|
||||
"""Run XMPlay to test audio."""
|
||||
extract_item('XMPlay', silent=True)
|
||||
cmd = [global_vars['Tools']['XMPlay'],
|
||||
r'{BinDir}\XMPlay\music.7z'.format(**global_vars)]
|
||||
|
||||
# Unmute audio first
|
||||
extract_item('NirCmd', silent=True)
|
||||
run_nircmd('mutesysvolume', '0')
|
||||
|
||||
# Open XMPlay
|
||||
popen_program(cmd)
|
||||
|
||||
def run_hitmanpro():
|
||||
"""Run HitmanPro in the background."""
|
||||
extract_item('HitmanPro', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['HitmanPro'],
|
||||
'/quiet', '/noinstall', '/noupload',
|
||||
r'/log={LogDir}\Tools\HitmanPro.txt'.format(**global_vars)]
|
||||
popen_program(cmd)
|
||||
|
||||
def run_process_killer():
|
||||
"""Kill most running processes skipping those in the whitelist.txt."""
|
||||
# borrowed from TronScript (reddit.com/r/TronScript)
|
||||
# credit to /u/cuddlychops06
|
||||
prev_dir = os.getcwd()
|
||||
extract_item('ProcessKiller', silent=True)
|
||||
os.chdir(r'{BinDir}\ProcessKiller'.format(**global_vars))
|
||||
run_program(['ProcessKiller.exe', '/silent'], check=False)
|
||||
os.chdir(prev_dir)
|
||||
|
||||
def run_rkill():
|
||||
"""Run RKill and cleanup afterwards."""
|
||||
extract_item('RKill', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['RKill'],
|
||||
'-s', '-l', r'{LogDir}\Tools\RKill.log'.format(**global_vars),
|
||||
'-new_console:n', '-new_console:s33V']
|
||||
run_program(cmd, check=False)
|
||||
wait_for_process('RKill')
|
||||
|
||||
# RKill cleanup
|
||||
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
|
||||
if os.path.exists(desktop_path):
|
||||
for item in os.scandir(desktop_path):
|
||||
if re.search(r'^RKill', item.name, re.IGNORECASE):
|
||||
dest = r'{LogDir}\Tools\{name}'.format(
|
||||
name=dest, **global_vars)
|
||||
dest = non_clobber_rename(dest)
|
||||
shutil.move(item.path, dest)
|
||||
|
||||
def show_alert_box(message, title='Wizard Kit Warning'):
|
||||
"""Show Windows alert box with message."""
|
||||
message_box = ctypes.windll.user32.MessageBoxW
|
||||
message_box(None, message, title, 0x00001030)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,7 +1,8 @@
|
|||
# Wizard Kit: Functions - Disk
|
||||
|
||||
from functions.common import *
|
||||
from functions import partition_uids
|
||||
from settings.partition_uids import *
|
||||
|
||||
|
||||
# Regex
|
||||
REGEX_BAD_PARTITION = re.compile(r'(RAW|Unknown)', re.IGNORECASE)
|
||||
|
|
@ -11,6 +12,7 @@ REGEX_DISK_GPT = re.compile(
|
|||
REGEX_DISK_MBR = re.compile(r'Disk ID: [A-Z0-9]+', re.IGNORECASE)
|
||||
REGEX_DISK_RAW = re.compile(r'Disk ID: 00000000', re.IGNORECASE)
|
||||
|
||||
|
||||
def assign_volume_letters():
|
||||
"""Assign a volume letter to all available volumes."""
|
||||
remove_volume_letters()
|
||||
|
|
@ -24,6 +26,7 @@ def assign_volume_letters():
|
|||
# Run
|
||||
run_diskpart(script)
|
||||
|
||||
|
||||
def get_boot_mode():
|
||||
"""Check if the boot mode was UEFI or legacy."""
|
||||
boot_mode = 'Legacy'
|
||||
|
|
@ -38,6 +41,7 @@ def get_boot_mode():
|
|||
|
||||
return boot_mode
|
||||
|
||||
|
||||
def get_disk_details(disk):
|
||||
"""Get disk details using DiskPart."""
|
||||
details = {}
|
||||
|
|
@ -63,6 +67,7 @@ def get_disk_details(disk):
|
|||
|
||||
return details
|
||||
|
||||
|
||||
def get_disks():
|
||||
"""Get list of attached disks using DiskPart."""
|
||||
disks = []
|
||||
|
|
@ -82,6 +87,7 @@ def get_disks():
|
|||
|
||||
return disks
|
||||
|
||||
|
||||
def get_partition_details(disk, partition):
|
||||
"""Get partition details using DiskPart and fsutil."""
|
||||
details = {}
|
||||
|
|
@ -113,7 +119,7 @@ def get_partition_details(disk, partition):
|
|||
details.update({key.strip(): value.strip() for (key, value) in tmp})
|
||||
|
||||
# Get MBR type / GPT GUID for extra details on "Unknown" partitions
|
||||
guid = partition_uids.lookup_guid(details.get('Type'))
|
||||
guid = PARTITION_UIDS.get(details.get('Type').upper(), {})
|
||||
if guid:
|
||||
details.update({
|
||||
'Description': guid.get('Description', '')[:29],
|
||||
|
|
@ -161,6 +167,7 @@ def get_partition_details(disk, partition):
|
|||
|
||||
return details
|
||||
|
||||
|
||||
def get_partitions(disk):
|
||||
"""Get list of partition using DiskPart."""
|
||||
partitions = []
|
||||
|
|
@ -184,6 +191,7 @@ def get_partitions(disk):
|
|||
|
||||
return partitions
|
||||
|
||||
|
||||
def get_table_type(disk):
|
||||
"""Get disk partition table type using DiskPart."""
|
||||
part_type = 'Unknown'
|
||||
|
|
@ -206,6 +214,7 @@ def get_table_type(disk):
|
|||
|
||||
return part_type
|
||||
|
||||
|
||||
def get_volumes():
|
||||
"""Get list of volumes using DiskPart."""
|
||||
vols = []
|
||||
|
|
@ -221,10 +230,12 @@ def get_volumes():
|
|||
|
||||
return vols
|
||||
|
||||
|
||||
def is_bad_partition(par):
|
||||
"""Check if the partition is accessible."""
|
||||
return 'Letter' not in par or REGEX_BAD_PARTITION.search(par['FileSystem'])
|
||||
|
||||
|
||||
def prep_disk_for_formatting(disk=None):
|
||||
"""Gather details about the disk and its partitions."""
|
||||
disk['Format Warnings'] = '\n'
|
||||
|
|
@ -270,6 +281,7 @@ def prep_disk_for_formatting(disk=None):
|
|||
# For all partitions
|
||||
partition['Display String'] = display
|
||||
|
||||
|
||||
def reassign_volume_letter(letter, new_letter='I'):
|
||||
"""Assign a new letter to a volume using DiskPart."""
|
||||
if not letter:
|
||||
|
|
@ -286,6 +298,7 @@ def reassign_volume_letter(letter, new_letter='I'):
|
|||
else:
|
||||
return new_letter
|
||||
|
||||
|
||||
def remove_volume_letters(keep=None):
|
||||
"""Remove all assigned volume letters using DiskPart."""
|
||||
if not keep:
|
||||
|
|
@ -303,6 +316,7 @@ def remove_volume_letters(keep=None):
|
|||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
|
||||
def run_diskpart(script):
|
||||
"""Run DiskPart script."""
|
||||
tempfile = r'{}\diskpart.script'.format(global_vars['Env']['TMP'])
|
||||
|
|
@ -321,6 +335,7 @@ def run_diskpart(script):
|
|||
sleep(2)
|
||||
return result
|
||||
|
||||
|
||||
def scan_disks():
|
||||
"""Get details about the attached disks"""
|
||||
disks = get_disks()
|
||||
|
|
@ -343,6 +358,7 @@ def scan_disks():
|
|||
# Done
|
||||
return disks
|
||||
|
||||
|
||||
def select_disk(title='Which disk?', disks=[]):
|
||||
"""Select a disk from the attached disks"""
|
||||
# Build menu
|
||||
|
|
@ -391,5 +407,8 @@ def select_disk(title='Which disk?', disks=[]):
|
|||
elif (selection == 'M'):
|
||||
raise GenericAbort
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,20 +1,9 @@
|
|||
# Wizard Kit: Functions - Information
|
||||
|
||||
from borrowed import knownpaths
|
||||
from functions.activation import *
|
||||
from operator import itemgetter
|
||||
|
||||
from functions.common import *
|
||||
from functions.activation import *
|
||||
|
||||
# Regex
|
||||
REGEX_OFFICE = re.compile(
|
||||
r'(Microsoft (Office\s+'
|
||||
r'(365|Enterprise|Home|Pro(\s|fessional)'
|
||||
r'|Single|Small|Standard|Starter|Ultimate|system)'
|
||||
r'|Works[-\s\d]+\d)'
|
||||
r'|(Libre|Open|Star)\s*Office'
|
||||
r'|WordPerfect|Gnumeric|Abiword)',
|
||||
re.IGNORECASE)
|
||||
|
||||
# STATIC VARIABLES
|
||||
REG_PROFILE_LIST = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
|
||||
|
|
@ -55,6 +44,18 @@ SHELL_FOLDERS = {
|
|||
),
|
||||
}
|
||||
|
||||
|
||||
# Regex
|
||||
REGEX_OFFICE = re.compile(
|
||||
r'(Microsoft (Office\s+'
|
||||
r'(365|Enterprise|Home|Pro(\s|fessional)'
|
||||
r'|Single|Small|Standard|Starter|Ultimate|system)'
|
||||
r'|Works[-\s\d]+\d)'
|
||||
r'|(Libre|Open|Star)\s*Office'
|
||||
r'|WordPerfect|Gnumeric|Abiword)',
|
||||
re.IGNORECASE)
|
||||
|
||||
|
||||
def backup_file_list():
|
||||
"""Export current file listing for the system."""
|
||||
extract_item('Everything', silent=True)
|
||||
|
|
@ -66,6 +67,7 @@ def backup_file_list():
|
|||
global_vars['Env']['SYSTEMDRIVE']]
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def backup_power_plans():
|
||||
"""Export current power plans."""
|
||||
os.makedirs(r'{BackupDir}\Power Plans\{Date}'.format(
|
||||
|
|
@ -83,6 +85,7 @@ def backup_power_plans():
|
|||
cmd = ['powercfg', '-export', out, guid]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
|
||||
def backup_registry(overwrite=False):
|
||||
"""Backup registry including user hives."""
|
||||
extract_item('erunt', silent=True)
|
||||
|
|
@ -97,6 +100,7 @@ def backup_registry(overwrite=False):
|
|||
cmd.append('/noconfirmdelete')
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def get_folder_size(path):
|
||||
"""Get (human-readable) size of folder passed, returns str."""
|
||||
size = 'Unknown'
|
||||
|
|
@ -119,6 +123,7 @@ def get_folder_size(path):
|
|||
size = human_readable_size(size)
|
||||
return size
|
||||
|
||||
|
||||
def get_installed_antivirus():
|
||||
"""Get list of installed Antivirus programs."""
|
||||
programs = []
|
||||
|
|
@ -149,6 +154,7 @@ def get_installed_antivirus():
|
|||
programs = ['No programs found']
|
||||
return programs
|
||||
|
||||
|
||||
def get_installed_office():
|
||||
"""Get list of installed Office programs."""
|
||||
programs = []
|
||||
|
|
@ -163,8 +169,9 @@ def get_installed_office():
|
|||
programs = ['No programs found']
|
||||
return programs
|
||||
|
||||
|
||||
def get_shell_path(folder, user='current'):
|
||||
"""Get shell path using SHGetKnownFolderPath via knownpaths, returns str.
|
||||
"""Get shell path using knownpaths, returns str.
|
||||
|
||||
NOTE: Only works for the current user.
|
||||
Code based on https://gist.github.com/mkropat/7550097
|
||||
|
|
@ -181,13 +188,15 @@ def get_shell_path(folder, user='current'):
|
|||
|
||||
if folderid:
|
||||
try:
|
||||
path = knownpaths.get_path(folderid, getattr(knownpaths.UserHandle, user))
|
||||
path = knownpaths.get_path(
|
||||
folderid, getattr(knownpaths.UserHandle, user))
|
||||
except PathNotFoundError:
|
||||
# Folder not found, ignore and return None
|
||||
pass
|
||||
|
||||
return path
|
||||
|
||||
|
||||
def get_user_data_paths(user):
|
||||
"""Get user data paths for provided user, returns dict."""
|
||||
hive_path = user['SID']
|
||||
|
|
@ -272,6 +281,7 @@ def get_user_data_paths(user):
|
|||
# Done
|
||||
return paths
|
||||
|
||||
|
||||
def get_user_folder_sizes(users):
|
||||
"""Update list(users) to include folder paths and sizes."""
|
||||
extract_item('du', filter='du*', silent=True)
|
||||
|
|
@ -292,6 +302,7 @@ def get_user_folder_sizes(users):
|
|||
u['Extra Folders'][folder]['Size'] = get_folder_size(
|
||||
u['Extra Folders'][folder]['Path'])
|
||||
|
||||
|
||||
def get_user_list():
|
||||
"""Get user list via WMIC, returns list of dicts."""
|
||||
users = []
|
||||
|
|
@ -324,6 +335,7 @@ def get_user_list():
|
|||
# Done
|
||||
return users
|
||||
|
||||
|
||||
def reg_path_exists(hive, path):
|
||||
"""Test if specified path exists, returns bool."""
|
||||
try:
|
||||
|
|
@ -333,6 +345,7 @@ def reg_path_exists(hive, path):
|
|||
else:
|
||||
return True
|
||||
|
||||
|
||||
def run_aida64():
|
||||
"""Run AIDA64 to save system reports."""
|
||||
extract_item('AIDA64', silent=True)
|
||||
|
|
@ -371,6 +384,7 @@ def run_aida64():
|
|||
'/TEXT', '/SILENT', '/SAFEST']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
|
||||
def run_bleachbit(cleaners=None, preview=True):
|
||||
"""Run BleachBit preview and save log.
|
||||
|
||||
|
|
@ -403,6 +417,7 @@ def run_bleachbit(cleaners=None, preview=True):
|
|||
for line in out.stdout.decode().splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
|
||||
|
||||
def show_disk_usage(disk):
|
||||
"""Show free and used space for a specified disk."""
|
||||
print_standard('{:5}'.format(disk.device.replace('/', ' ')),
|
||||
|
|
@ -422,6 +437,7 @@ def show_disk_usage(disk):
|
|||
except Exception:
|
||||
print_warning('Unknown', timestamp=False)
|
||||
|
||||
|
||||
def show_free_space(indent=8, width=32):
|
||||
"""Show free space info for all fixed disks."""
|
||||
message = 'Free Space:'
|
||||
|
|
@ -435,6 +451,7 @@ def show_free_space(indent=8, width=32):
|
|||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def show_installed_ram():
|
||||
"""Show installed RAM."""
|
||||
mem = psutil.virtual_memory()
|
||||
|
|
@ -447,6 +464,7 @@ def show_installed_ram():
|
|||
else:
|
||||
print_error(human_readable_size(mem.total).strip(), timestamp=False)
|
||||
|
||||
|
||||
def show_os_activation():
|
||||
"""Show OS activation info."""
|
||||
act_str = get_activation_string()
|
||||
|
|
@ -457,6 +475,7 @@ def show_os_activation():
|
|||
else:
|
||||
print_error(act_str, timestamp=False)
|
||||
|
||||
|
||||
def show_os_name():
|
||||
"""Show extended OS name (including warnings)."""
|
||||
os_name = global_vars['OS']['DisplayName']
|
||||
|
|
@ -464,13 +483,17 @@ def show_os_name():
|
|||
# Show all 32-bit installs as an error message
|
||||
print_error(os_name, timestamp=False)
|
||||
else:
|
||||
if re.search(r'(preview build|unrecognized|unsupported)', os_name, re.IGNORECASE):
|
||||
if re.search(
|
||||
r'(preview build|unrecognized|unsupported)',
|
||||
os_name,
|
||||
re.IGNORECASE):
|
||||
print_error(os_name, timestamp=False)
|
||||
elif re.search(r'outdated', os_name, re.IGNORECASE):
|
||||
print_warning(os_name, timestamp=False)
|
||||
else:
|
||||
print_standard(os_name, timestamp=False)
|
||||
|
||||
|
||||
def show_temp_files_size():
|
||||
"""Show total size of temp files identified by BleachBit."""
|
||||
size = None
|
||||
|
|
@ -484,6 +507,7 @@ def show_temp_files_size():
|
|||
else:
|
||||
print_standard(size, timestamp=False)
|
||||
|
||||
|
||||
def show_user_data_summary(indent=8, width=32):
|
||||
"""Print user data folder sizes for all users."""
|
||||
users = get_user_list()
|
||||
|
|
@ -516,5 +540,8 @@ def show_user_data_summary(indent=8, width=32):
|
|||
size = folders[folder].get('Size', 'Unknown'),
|
||||
path = folders[folder].get('Path', 'Unknown')))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -1,16 +1,12 @@
|
|||
#!/bin/python3
|
||||
#
|
||||
## Wizard Kit: Functions - Network
|
||||
# Wizard Kit: Functions - Network
|
||||
|
||||
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 *
|
||||
|
||||
|
||||
# REGEX
|
||||
REGEX_VALID_IP = re.compile(
|
||||
r'(10.\d+.\d+.\d+'
|
||||
|
|
@ -18,6 +14,7 @@ REGEX_VALID_IP = re.compile(
|
|||
r'|192.168.\d+.\d+)',
|
||||
re.IGNORECASE)
|
||||
|
||||
|
||||
def connect_to_network():
|
||||
"""Connect to network if not already connected."""
|
||||
net_ifs = psutil.net_if_addrs()
|
||||
|
|
@ -38,6 +35,7 @@ def connect_to_network():
|
|||
function = run_program,
|
||||
cmd = cmd)
|
||||
|
||||
|
||||
def is_connected():
|
||||
"""Check for a valid private IP."""
|
||||
devs = psutil.net_if_addrs()
|
||||
|
|
@ -49,6 +47,7 @@ def is_connected():
|
|||
# Else
|
||||
return False
|
||||
|
||||
|
||||
def show_valid_addresses():
|
||||
"""Show all valid private IP addresses assigned to the system."""
|
||||
devs = psutil.net_if_addrs()
|
||||
|
|
@ -58,6 +57,7 @@ def show_valid_addresses():
|
|||
# Valid IP found
|
||||
show_data(message=dev, data=family.address)
|
||||
|
||||
|
||||
def speedtest():
|
||||
"""Run a network speedtest using speedtest-cli."""
|
||||
result = run_program(['speedtest-cli', '--simple'])
|
||||
|
|
@ -67,6 +67,8 @@ def speedtest():
|
|||
output = [(a, float(b), c) for a, b, c in output]
|
||||
return ['{:10}{:6.2f} {}'.format(*line) for line in output]
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -1,326 +0,0 @@
|
|||
# Wizard Kit: Functions - PARTITION UIDs
|
||||
# sources: https://en.wikipedia.org/wiki/GUID_Partition_Table
|
||||
# https://en.wikipedia.org/wiki/Partition_type
|
||||
# NOTE: Info has been trimmed for brevity. As such, there may be some inaccuracy.
|
||||
|
||||
PARTITION_UIDS = {
|
||||
'00': {'OS': 'All','Description': 'Empty partition entry'},
|
||||
'01': {'OS': 'DOS','Description': 'FAT12 as primary partition'},
|
||||
'02': {'OS': 'XENIX','Description': 'XENIX root'},
|
||||
'03': {'OS': 'XENIX','Description': 'XENIX usr'},
|
||||
'04': {'OS': 'DOS','Description': 'FAT16 with less than 32 MB'},
|
||||
'05': {'OS': 'DOS / SpeedStor','Description': 'Extended partition'},
|
||||
'06': {'OS': 'DOS1+','Description': 'FAT16B [over 65K sectors]'},
|
||||
'07': {'OS': 'Windows / OS/2 / QNX 2','Description': 'NTFS/exFAT/HPFS/IFS/QNX'},
|
||||
'08': {'OS': 'CBM / DOS / OS/2 / AIX /QNX','Description': 'FAT12-16/AIX/QNY/SplitDrive'},
|
||||
'09': {'OS': 'AIX / QNX / Coherent / OS-9','Description': 'AIX/QNZ/Coherent/RBF'},
|
||||
'0A': {'OS': 'OS/2 / Coherent','Description': 'Boot Manager / Swap'},
|
||||
'0B': {'OS': 'DOS','Description': 'FAT32 with CHS addressing'},
|
||||
'0C': {'OS': 'DOS','Description': 'FAT32 with LBA'},
|
||||
'0D': {'OS': 'Silicon Safe','Description': 'Reserved'},
|
||||
'0E': {'OS': 'DOS','Description': 'FAT16B with LBA'},
|
||||
'0F': {'OS': 'DOS','Description': 'Extended partition with LBA'},
|
||||
'10': {'OS': 'OPUS','Description': 'Unknown'},
|
||||
'11': {'OS': 'Leading Edge MS-DOS / OS/2','Description': 'FAT12/FAT16'},
|
||||
'12': {'OS': 'Compaq Contura','Description': 'conf/diag/hiber/rescue/serv'},
|
||||
'14': {'OS': 'AST DOS / OS/2 / MaverickOS','Description': 'FAT12/FAT16/Omega'},
|
||||
'15': {'OS': 'OS/2 / Maverick OS','Description': 'Hidden extended / Swap'},
|
||||
'16': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16B'},
|
||||
'17': {'OS': 'OS/2 Boot Manager','Description': 'Hidden IFS/HPFS/NTFS/exFAT'},
|
||||
'18': {'OS': 'AST Windows','Description': '0-Volt Suspend/SmartSleep'},
|
||||
'19': {'OS': 'Willowtech Photon coS','Description': 'Willowtech Photon coS'},
|
||||
'1B': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32'},
|
||||
'1C': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32 with LBA'},
|
||||
'1E': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16 with LBA'},
|
||||
'1F': {'OS': 'OS/2 Boot Manager','Description': 'Hidden extended with LBA'},
|
||||
'20': {'OS': 'Windows Mobile','Description': 'update XIP/Willowsoft OFS1'},
|
||||
'21': {'OS': 'Oxygen','Description': 'SpeedStor / FSo2'},
|
||||
'22': {'OS': 'Oxygen','Description': 'Oxygen Extended Partition'},
|
||||
'23': {'OS': 'Windows Mobile','Description': 'Reserved / boot XIP'},
|
||||
'24': {'OS': 'NEC MS-DOS0','Description': 'Logical FAT12 or FAT16'},
|
||||
'25': {'OS': 'Windows Mobile','Description': 'IMGFS[citation needed]'},
|
||||
'26': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'27': {'OS': 'Win/PQserv/MirOS/RooterBOOT','Description': 'WinRE/Rescue/MirOS/RooterBOOT'},
|
||||
'2A': {'OS': 'AtheOS','Description': 'AthFS/AFS/Reserved'},
|
||||
'2B': {'OS': 'SyllableOS','Description': 'SyllableSecure (SylStor)'},
|
||||
'31': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'32': {'OS': 'NOS','Description': 'Unknown'},
|
||||
'33': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'34': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'35': {'OS': 'OS/2 Server /eComStation','Description': 'JFS'},
|
||||
'36': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'38': {'OS': 'THEOS','Description': 'THEOS version 3.2, 2 GB'},
|
||||
'39': {'OS': 'Plan 9 / THEOS','Description': 'Plan 9 edition 3 / THEOS v4'},
|
||||
'3A': {'OS': 'THEOS','Description': 'THEOS v4, 4 GB'},
|
||||
'3B': {'OS': 'THEOS','Description': 'THEOS v4 extended'},
|
||||
'3C': {'OS': 'PartitionMagic','Description': 'PqRP (image in progress)'},
|
||||
'3D': {'OS': 'PartitionMagic','Description': 'Hidden NetWare'},
|
||||
'3F': {'OS': 'OS/32','Description': 'Unknown'},
|
||||
'40': {'OS': 'PICK / Venix','Description': 'PICK R83 / Venix 80286'},
|
||||
'41': {'OS': 'RISC / Linux / PowerPC','Description': 'Boot / Old Linux/Minix'},
|
||||
'42': {'OS': 'SFS / Linux / Win2K/XP/etc','Description': 'SFS / Old Linux Swap'},
|
||||
'43': {'OS': 'Linux','Description': 'Old Linux native'},
|
||||
'44': {'OS': 'GoBack','Description': 'Norton/WildFire/Adaptec/Roxio'},
|
||||
'45': {'OS': 'Boot-US / EUMEL/ELAN','Description': 'Priam/Boot/EUMEL/ELAN (L2)'},
|
||||
'46': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'},
|
||||
'47': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'},
|
||||
'48': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2), ERGOS L3'},
|
||||
'4A': {'OS': 'AdaOS / ALFS/THIN','Description': 'Aquila / ALFS/THIN'},
|
||||
'4C': {'OS': 'ETH Oberon','Description': 'Aos (A2) file system (76)'},
|
||||
'4D': {'OS': 'QNX Neutrino','Description': 'Primary QNX POSIX volume'},
|
||||
'4E': {'OS': 'QNX Neutrino','Description': 'Secondary QNX POSIX volume'},
|
||||
'4F': {'OS': 'QNX Neutrino / ETH Oberon','Description': '3rd QNX POSIX/Boot/Native'},
|
||||
'50': {'OS': 'DiskMan4/ETH/LynxOS/Novell','Description': 'Alt FS/Read-only/Lynx RTOS'},
|
||||
'51': {'OS': 'Disk Manager 4-6','Description': 'R/W partition (Aux 1)'},
|
||||
'52': {'OS': 'CP/M-80/ System V/AT, V/386','Description': 'CP/M-80'},
|
||||
'53': {'OS': 'Disk Manager 6','Description': 'Auxiliary 3 (WO)'},
|
||||
'54': {'OS': 'Disk Manager 6','Description': 'Dynamic Drive Overlay (DDO)'},
|
||||
'55': {'OS': 'EZ-Drive','Description': 'Maxtor/MaxBlast/DriveGuide'},
|
||||
'56': {'OS': 'AT&T DOS/EZ-Drive/VFeature','Description': 'FAT12~16/EZ-BIOS/VFeature'},
|
||||
'57': {'OS': 'DrivePro','Description': 'VNDI partition'},
|
||||
'5C': {'OS': 'EDISK','Description': 'Priam EDisk Volume'},
|
||||
'61': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'63': {'OS': 'Unix','Description': 'Unix,ISC,SysV,ix,BSD,HURD'},
|
||||
'64': {'OS': 'SpeedStor / NetWare','Description': 'NetWare FS 286/2,PC-ARMOUR'},
|
||||
'65': {'OS': 'NetWare','Description': 'NetWare File System 386'},
|
||||
'66': {'OS': 'NetWare / NetWare','Description': 'NetWare FS 386 / SMS'},
|
||||
'67': {'OS': 'NetWare','Description': 'Wolf Mountain'},
|
||||
'68': {'OS': 'NetWare','Description': 'Unknown'},
|
||||
'69': {'OS': 'NetWare 5 / NetWare','Description': 'Novell Storage Services'},
|
||||
'6E': {'Description': 'Unknown'},
|
||||
'70': {'OS': 'DiskSecure','Description': 'DiskSecure multiboot'},
|
||||
'71': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'72': {'OS': 'APTI systems / Unix V7/x86','Description': 'APTI altFAT12 / V7 / x86'},
|
||||
'73': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'74': {'OS': 'Microsoft, IBM','Description': 'Reserved / Scramdisk'},
|
||||
'75': {'OS': 'PC/IX','Description': 'Unknown'},
|
||||
'76': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'77': {'OS': 'Novell','Description': 'VNDI, M2FS, M2CS'},
|
||||
'78': {'OS': 'Geurt Vos','Description': 'XOSL bootloader file system'},
|
||||
'79': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (CHS, SFN)'},
|
||||
'7A': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (LBA, SFN)'},
|
||||
'7B': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16B (CHS, SFN)'},
|
||||
'7C': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (LBA, SFN)'},
|
||||
'7D': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (CHS, SFN)'},
|
||||
'7E': {'OS': 'F.I.X. (claim) / PrimoCache','Description': 'Level 2 cache'},
|
||||
'7F': {'OS': 'Varies','Description': 'AltOS DevPartition Standard'},
|
||||
'80': {'OS': 'Minix 1.1-1.4a','Description': 'Minix file system (old)'},
|
||||
'81': {'OS': 'Minix 1.4b+ / Linux','Description': 'MINIX FS/Mitac AdvDiskManager'},
|
||||
'82': {'OS': 'Linux / Sun Microsystems','Description': 'Swap / Solaris x86 / Prime'},
|
||||
'83': {'OS': 'GNU/Linux','Description': 'Any native Linux FS'},
|
||||
'84': {'OS': 'OS/2 / Windows 7','Description': 'Hibernat/HiddenC/RapidStart'},
|
||||
'85': {'OS': 'GNU/Linux','Description': 'Linux extended'},
|
||||
'86': {'OS': 'Windows NT 4 Server / Linux','Description': 'FAT16B mirror/LinuxRAID-old'},
|
||||
'87': {'OS': 'Windows NT 4 Server','Description': 'HPFS/NTFS mirrored volume'},
|
||||
'88': {'OS': 'GNU/Linux','Description': 'Plaintext partition table'},
|
||||
'8A': {'OS': 'AiR-BOOT','Description': 'Linux kernel image'},
|
||||
'8B': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'},
|
||||
'8C': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'},
|
||||
'8D': {'OS': 'Free FDISK','Description': 'Hidden FAT12'},
|
||||
'8E': {'OS': 'Linux','Description': 'Linux LVM'},
|
||||
'90': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
||||
'91': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
||||
'92': {'OS': 'Free FDISK','Description': 'Hidden FAT16B'},
|
||||
'93': {'OS': 'Amoeba / Linux','Description': 'Amoeba native/Hidden Linux'},
|
||||
'94': {'OS': 'Amoeba','Description': 'Amoeba bad block table'},
|
||||
'95': {'OS': 'EXOPC','Description': 'EXOPC native'},
|
||||
'96': {'OS': 'CHRP','Description': 'ISO-9660 file system'},
|
||||
'97': {'OS': 'Free FDISK','Description': 'Hidden FAT32'},
|
||||
'98': {'OS': 'Free FDISK / ROM-DOS','Description': 'Hidden FAT32 / service part'},
|
||||
'99': {'OS': 'early Unix','Description': 'Unknown'},
|
||||
'9A': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
||||
'9B': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
||||
'9E': {'OS': 'VSTA / ForthOS','Description': 'ForthOS (eForth port)'},
|
||||
'9F': {'OS': 'BSD/OS 3.0+, BSDI','Description': 'Unknown'},
|
||||
'A0': {'OS': 'HP/Phoenix/IBM/Toshiba/Sony','Description': 'Diagnostic for HP/Hibernate'},
|
||||
'A1': {'OS': 'HP / Phoenix, NEC','Description': 'HP Vol Expansion/Hibernate'},
|
||||
'A2': {'OS': 'Cyclone V','Description': 'Hard Processor System (HPS)'},
|
||||
'A3': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'A4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'A5': {'OS': 'BSD','Description': 'BSD slice'},
|
||||
'A6': {'OS': 'OpenBSD','Description': 'HP Vol Expansion/BSD slice'},
|
||||
'A7': {'OS': 'NeXT','Description': 'NeXTSTEP'},
|
||||
'A8': {'OS': 'Darwin, Mac OS X','Description': 'Apple Darwin, Mac OS X UFS'},
|
||||
'A9': {'OS': 'NetBSD','Description': 'NetBSD slice'},
|
||||
'AA': {'OS': 'MS-DOS','Description': 'Olivetti DOS FAT12(1.44 MB)'},
|
||||
'AB': {'OS': 'Darwin, Mac OS X / GO! OS','Description': 'Apple Darwin/OS X boot/GO!'},
|
||||
'AD': {'OS': 'RISC OS','Description': 'ADFS / FileCore format'},
|
||||
'AE': {'OS': 'ShagOS','Description': 'ShagOS file system'},
|
||||
'AF': {'OS': 'ShagOS','Description': 'OS X HFS & HFS+/ShagOS Swap'},
|
||||
'B0': {'OS': 'Boot-Star','Description': 'Boot-Star dummy partition'},
|
||||
'B1': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
||||
'B2': {'OS': 'QNX 6.x','Description': 'QNX Neutrino power-safe FS'},
|
||||
'B3': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
||||
'B4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'B6': {'OS': 'Windows NT 4 Server','Description': 'HPVolExpansion/FAT16Bmirror'},
|
||||
'B7': {'OS': 'BSDI / Windows NT 4 Server','Description': 'BSDI,Swap,HPFS/NTFS mirror'},
|
||||
'B8': {'OS': 'BSDI (before 3.0)','Description': 'BSDI Swap / native FS'},
|
||||
'BB': {'OS': 'Acronis/BootWizard/WinNT 4','Description': 'BootWizard/OEM/FAT32 mirror'},
|
||||
'BC': {'OS': 'Acronis/WinNT/BackupCapsule','Description': 'FAT32RAID/SecureZone/Backup'},
|
||||
'BD': {'OS': 'BonnyDOS/286','Description': 'Unknown'},
|
||||
'BE': {'OS': 'Solaris 8','Description': 'Solaris 8 boot'},
|
||||
'BF': {'OS': 'Solaris','Description': 'Solaris x86'},
|
||||
'C0': {'OS': 'DR-DOS,MultiuserDOS,REAL/32','Description': 'Secured FAT (under 32 MB)'},
|
||||
'C1': {'OS': 'DR DOS','Description': 'Secured FAT12'},
|
||||
'C2': {'OS': 'Power Boot','Description': 'Hidden Linux native FS'},
|
||||
'C3': {'OS': 'Power Boot','Description': 'Hidden Linux Swap'},
|
||||
'C4': {'OS': 'DR DOS','Description': 'Secured FAT16'},
|
||||
'C5': {'OS': 'DR DOS','Description': 'Secured extended partition'},
|
||||
'C6': {'OS': 'DR DOS / WinNT 4 Server','Description': 'Secured FAT16B/FAT16Bmirror'},
|
||||
'C7': {'OS': 'Syrinx / WinNT 4 Server','Description': 'Syrinx boot/HPFS/NTFSmirror'},
|
||||
'C8': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'C9': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'CA': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'CB': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'},
|
||||
'CC': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'},
|
||||
'CD': {'OS': 'CTOS','Description': 'Memory dump'},
|
||||
'CE': {'OS': 'DR-DOSx','Description': 'Secured FAT16B'},
|
||||
'CF': {'OS': 'DR-DOSx','Description': 'Secured extended partition'},
|
||||
'D0': {'OS': 'Multiuser DOS, REAL/32','Description': 'Secured FAT (over 32 MB)'},
|
||||
'D1': {'OS': 'Multiuser DOS','Description': 'Secured FAT12'},
|
||||
'D4': {'OS': 'Multiuser DOS','Description': 'Secured FAT16'},
|
||||
'D5': {'OS': 'Multiuser DOS','Description': 'Secured extended partition'},
|
||||
'D6': {'OS': 'Multiuser DOS','Description': 'Secured FAT16B'},
|
||||
'D8': {'OS': 'Digital Research','Description': 'CP/M-86 [citation needed]'},
|
||||
'DA': {'OS': 'Powercopy Backup','Description': 'Non-FS data / Shielded disk'},
|
||||
'DB': {'OS': 'CP/M-86/CDOS/CTOS/D800/DRMK','Description': 'CP/M-86/ConcDOS/Boot/FAT32'},
|
||||
'DD': {'OS': 'CTOS','Description': 'Hidden memory dump'},
|
||||
'DE': {'OS': 'Dell','Description': 'FAT16 utility/diagnostic'},
|
||||
'DF': {'OS': 'DG/UX / BootIt / Aviion','Description': 'DG/UX Virt DiskMan / EMBRM'},
|
||||
'E0': {'OS': 'STMicroelectronics','Description': 'ST AVFS'},
|
||||
'E1': {'OS': 'SpeedStor','Description': 'ExtendedFAT12 >1023cylinder'},
|
||||
'E2': {'Description': 'DOS read-only (XFDISK)'},
|
||||
'E3': {'OS': 'SpeedStor','Description': 'DOS read-only'},
|
||||
'E4': {'OS': 'SpeedStor','Description': 'ExtendedFAT16 <1024cylinder'},
|
||||
'E5': {'OS': 'Tandy MS-DOS','Description': 'Logical FAT12 or FAT16'},
|
||||
'E6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'E8': {'OS': 'LUKS','Description': 'Linux Unified Key Setup'},
|
||||
'EB': {'OS': 'BeOS, Haiku','Description': 'BFS'},
|
||||
'EC': {'OS': 'SkyOS','Description': 'SkyFS'},
|
||||
'ED': {'OS': 'Sprytix / EDD 4','Description': 'EDC loader / GPT hybrid MBR'},
|
||||
'EE': {'OS': 'EFI','Description': 'GPT protective MBR'},
|
||||
'EF': {'OS': 'EFI','Description': 'EFI system partition'},
|
||||
'F0': {'OS': 'Linux / OS/32','Description': 'PA-RISC Linux boot loader.'},
|
||||
'F1': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F2': {'OS': 'SperryIT DOS/Unisys DOS','Description': 'Logical FAT12/FAT16'},
|
||||
'F3': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F4': {'OS': 'SpeedStor / Prologue','Description': '"large"DOS part/NGF/TwinFS'},
|
||||
'F5': {'OS': 'Prologue','Description': 'MD0-MD9 part for NGF/TwinFS'},
|
||||
'F6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F7': {'OS': 'O.S.G. / X1','Description': 'EFAT / Solid State FS'},
|
||||
'F9': {'OS': 'Linux','Description': 'pCache ext2/ext3 cache'},
|
||||
'FA': {'OS': 'Bochs','Description': 'x86 emulator'},
|
||||
'FB': {'OS': 'VMware','Description': 'VMware VMFS partition'},
|
||||
'FC': {'OS': 'VMware','Description': 'Swap / VMKCORE kernel dump'},
|
||||
'FD': {'OS': 'Linux / FreeDOS','Description': 'LinuxRAID/Reserved4FreeDOS'},
|
||||
'FE': {'OS': 'SpeedStor/LANstep/NT/Linux','Description': 'PS/2/DiskAdmin/old LinuxLVM'},
|
||||
'FF': {'OS': 'XENIX','Description': 'XENIX bad block table'},
|
||||
'00000000-0000-0000-0000-000000000000': {'Description': 'Unused entry'},
|
||||
'024DEE41-33E7-11D3-9D69-0008C781F39F': {'Description': 'MBR partition scheme'},
|
||||
'C12A7328-F81F-11D2-BA4B-00A0C93EC93B': {'Description': 'EFI System partition'},
|
||||
'21686148-6449-6E6F-744E-656564454649': {'Description': 'BIOS Boot partition'},
|
||||
'D3BFE2DE-3DAF-11DF-BA40-E3A556D89593': {'Description': 'Intel Fast Flash (iFFS) partition (for Intel Rapid Start technology)'},
|
||||
'F4019732-066E-4E12-8273-346C5641494F': {'Description': 'Sony boot partition'},
|
||||
'BFBFAFE7-A34F-448A-9A5B-6213EB736C22': {'Description': 'Lenovo boot partition'},
|
||||
'E3C9E316-0B5C-4DB8-817D-F92DF00215AE': {'OS': 'Windows', 'Description': 'Microsoft Reserved Partition (MSR)'},
|
||||
'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7': {'OS': 'Windows', 'Description': 'Basic data partition'},
|
||||
'5808C8AA-7E8F-42E0-85D2-E1E90434CFB3': {'OS': 'Windows', 'Description': 'Logical Disk Manager (LDM) metadata partition'},
|
||||
'AF9B60A0-1431-4F62-BC68-3311714A69AD': {'OS': 'Windows', 'Description': 'Logical Disk Manager data partition'},
|
||||
'DE94BBA4-06D1-4D40-A16A-BFD50179D6AC': {'OS': 'Windows', 'Description': 'Windows Recovery Environment'},
|
||||
'37AFFC90-EF7D-4E96-91C3-2D7AE055B174': {'OS': 'Windows', 'Description': 'IBM General Parallel File System (GPFS) partition'},
|
||||
'E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D': {'OS': 'Windows', 'Description': 'Storage Spaces partition'},
|
||||
'75894C1E-3AEB-11D3-B7C1-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Data partition'},
|
||||
'E2A1E728-32E3-11D6-A682-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Service Partition'},
|
||||
'0FC63DAF-8483-4772-8E79-3D69D8477DE4': {'OS': 'Linux', 'Description': 'Linux filesystem data'},
|
||||
'A19D880F-05FC-4D3B-A006-743F0F84911E': {'OS': 'Linux', 'Description': 'RAID partition'},
|
||||
'44479540-F297-41B2-9AF7-D131D5F0458A': {'OS': 'Linux', 'Description': 'Root partition (x86)'},
|
||||
'4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709': {'OS': 'Linux', 'Description': 'Root partition (x86-64)'},
|
||||
'69DAD710-2CE4-4E3C-B16C-21A1D49ABED3': {'OS': 'Linux', 'Description': 'Root partition (32-bit ARM)'},
|
||||
'B921B045-1DF0-41C3-AF44-4C6F280D3FAE': {'OS': 'Linux', 'Description': 'Root partition (64-bit ARM)/AArch64)'},
|
||||
'0657FD6D-A4AB-43C4-84E5-0933C84B4F4F': {'OS': 'Linux', 'Description': 'Swap partition'},
|
||||
'E6D6D379-F507-44C2-A23C-238F2A3DF928': {'OS': 'Linux', 'Description': 'Logical Volume Manager (LVM) partition'},
|
||||
'933AC7E1-2EB4-4F13-B844-0E14E2AEF915': {'OS': 'Linux', 'Description': '/home partition'},
|
||||
'3B8F8425-20E0-4F3B-907F-1A25A76F98E8': {'OS': 'Linux', 'Description': '/srv (server data) partition'},
|
||||
'7FFEC5C9-2D00-49B7-8941-3EA10A5586B7': {'OS': 'Linux', 'Description': 'Plain dm-crypt partition'},
|
||||
'CA7D7CCB-63ED-4C53-861C-1742536059CC': {'OS': 'Linux', 'Description': 'LUKS partition'},
|
||||
'8DA63339-0007-60C0-C436-083AC8230908': {'OS': 'Linux', 'Description': 'Reserved'},
|
||||
'83BD6B9D-7F41-11DC-BE0B-001560B84F0F': {'OS': 'FreeBSD', 'Description': 'Boot partition'},
|
||||
'516E7CB4-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Data partition'},
|
||||
'516E7CB5-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Swap partition'},
|
||||
'516E7CB6-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Unix File System (UFS) partition'},
|
||||
'516E7CB8-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Vinum volume manager partition'},
|
||||
'516E7CBA-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'ZFS partition'},
|
||||
'48465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Hierarchical File System Plus (HFS+) partition'},
|
||||
'55465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple UFS'},
|
||||
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'OS X Darwin', 'Description': 'ZFS'},
|
||||
'52414944-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple RAID partition'},
|
||||
'52414944-5F4F-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple RAID partition, offline'},
|
||||
'426F6F74-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Boot partition (Recovery HD)'},
|
||||
'4C616265-6C00-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Label'},
|
||||
'5265636F-7665-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple TV Recovery partition'},
|
||||
'53746F72-6167-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Core Storage (i.e. Lion FileVault) partition'},
|
||||
'6A82CB45-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Boot partition'},
|
||||
'6A85CF4D-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Root partition'},
|
||||
'6A87C46F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Swap partition'},
|
||||
'6A8B642B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Backup partition'},
|
||||
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/usr partition'},
|
||||
'6A8EF2E9-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/var partition'},
|
||||
'6A90BA39-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/home partition'},
|
||||
'6A9283A5-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Alternate sector'},
|
||||
'6A945A3B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Reserved partition'},
|
||||
'6A9630D1-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A980767-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A96237F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A8D2AC7-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'49F48D32-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Swap partition'},
|
||||
'49F48D5A-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'FFS partition'},
|
||||
'49F48D82-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'LFS partition'},
|
||||
'49F48DAA-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'RAID partition'},
|
||||
'2DB519C4-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Concatenated partition'},
|
||||
'2DB519EC-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Encrypted partition'},
|
||||
'FE3A2A5D-4F32-41A7-B725-ACCC3285A309': {'OS': 'ChromeOS', 'Description': 'ChromeOS kernel'},
|
||||
'3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC': {'OS': 'ChromeOS', 'Description': 'ChromeOS rootfs'},
|
||||
'2E0A753D-9E48-43B0-8337-B15192CB1B5E': {'OS': 'ChromeOS', 'Description': 'ChromeOS future use'},
|
||||
'42465331-3BA3-10F1-802A-4861696B7521': {'OS': 'Haiku', 'Description': 'Haiku BFS'},
|
||||
'85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Boot partition'},
|
||||
'85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Data partition'},
|
||||
'85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Swap partition'},
|
||||
'0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Unix File System (UFS) partition'},
|
||||
'85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Vinum volume manager partition'},
|
||||
'85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'ZFS partition'},
|
||||
'45B0969E-9B03-4F30-B4C6-B4B80CEFF106': {'OS': 'Ceph', 'Description': 'Ceph Journal'},
|
||||
'45B0969E-9B03-4F30-B4C6-5EC00CEFF106': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt Encrypted Journal'},
|
||||
'4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph OSD'},
|
||||
'4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt OSD'},
|
||||
'89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph disk in creation'},
|
||||
'89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt disk in creation'},
|
||||
'824CC7A0-36A8-11E3-890A-952519AD3F61': {'OS': 'OpenBSD', 'Description': 'Data partition'},
|
||||
'CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1': {'OS': 'QNX', 'Description': 'Power-safe (QNX6) file system'},
|
||||
'C91818F9-8025-47AF-89D2-F030D7000C2C': {'OS': 'Plan 9', 'Description': 'Plan 9 partition'},
|
||||
'9D275380-40AD-11DB-BF97-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'vmkcore (coredump partition)'},
|
||||
'AA31E02A-400F-11DB-9590-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMFS filesystem partition'},
|
||||
'9198EFFC-31C0-11DB-8F78-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMware Reserved'},
|
||||
'2568845D-2332-4675-BC39-8FA5A4748D15': {'OS': 'Android-IA', 'Description': 'Bootloader'},
|
||||
'114EAFFE-1552-4022-B26E-9B053604CF84': {'OS': 'Android-IA', 'Description': 'Bootloader2'},
|
||||
'49A4D17F-93A3-45C1-A0DE-F50B2EBE2599': {'OS': 'Android-IA', 'Description': 'Boot'},
|
||||
'4177C722-9E92-4AAB-8644-43502BFD5506': {'OS': 'Android-IA', 'Description': 'Recovery'},
|
||||
'EF32A33B-A409-486C-9141-9FFB711F6266': {'OS': 'Android-IA', 'Description': 'Misc'},
|
||||
'20AC26BE-20B7-11E3-84C5-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Metadata'},
|
||||
'38F428E6-D326-425D-9140-6E0EA133647C': {'OS': 'Android-IA', 'Description': 'System'},
|
||||
'A893EF21-E428-470A-9E55-0668FD91A2D9': {'OS': 'Android-IA', 'Description': 'Cache'},
|
||||
'DC76DDA9-5AC1-491C-AF42-A82591580C0D': {'OS': 'Android-IA', 'Description': 'Data'},
|
||||
'EBC597D0-2053-4B15-8B64-E0AAC75F4DB1': {'OS': 'Android-IA', 'Description': 'Persistent'},
|
||||
'8F68CC74-C5E5-48DA-BE91-A0C8C15E9C80': {'OS': 'Android-IA', 'Description': 'Factory'},
|
||||
'767941D0-2085-11E3-AD3B-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Fastboot / Tertiary'},
|
||||
'AC6D7924-EB71-4DF8-B48D-E267B27148FF': {'OS': 'Android-IA', 'Description': 'OEM'},
|
||||
'7412F7D5-A156-4B13-81DC-867174929325': {'OS': 'ONIE', 'Description': 'Boot'},
|
||||
'D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149': {'OS': 'ONIE', 'Description': 'Config'},
|
||||
'9E1A2D38-C612-4316-AA26-8B49521E5A8B': {'OS': 'PowerPC', 'Description': 'PReP boot'},
|
||||
'BC13C2FF-59E6-4262-A352-B275FD6F7172': {'OS': 'Freedesktop', 'Description': 'Extended Boot Partition ($BOOT)'},
|
||||
}
|
||||
|
||||
def lookup_guid(guid):
|
||||
return PARTITION_UIDS.get(guid.upper(), {})
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -2,12 +2,14 @@
|
|||
|
||||
from functions.common import *
|
||||
|
||||
|
||||
# Regex
|
||||
REGEX_REGISTRY_DIRS = re.compile(
|
||||
r'^(config$|RegBack$|System32$|Transfer|Win)',
|
||||
re.IGNORECASE)
|
||||
REGEX_SOFTWARE_HIVE = re.compile(r'^Software$', re.IGNORECASE)
|
||||
|
||||
|
||||
def extract_keys():
|
||||
"""Extract keys from provided hives and return a dict."""
|
||||
keys = {}
|
||||
|
|
@ -43,6 +45,7 @@ def extract_keys():
|
|||
# Done
|
||||
return keys
|
||||
|
||||
|
||||
def list_clientdir_keys():
|
||||
"""List product keys found in hives inside the ClientDir."""
|
||||
keys = extract_keys()
|
||||
|
|
@ -57,6 +60,7 @@ def list_clientdir_keys():
|
|||
|
||||
return key_list
|
||||
|
||||
|
||||
def find_software_hives():
|
||||
"""Search for transferred SW hives and return a list."""
|
||||
hives = []
|
||||
|
|
@ -71,6 +75,7 @@ def find_software_hives():
|
|||
|
||||
return hives
|
||||
|
||||
|
||||
def get_product_keys():
|
||||
"""List product keys from saved report."""
|
||||
keys = []
|
||||
|
|
@ -86,6 +91,7 @@ def get_product_keys():
|
|||
else:
|
||||
return ['No product keys found']
|
||||
|
||||
|
||||
def run_produkey():
|
||||
"""Run ProduKey and save report in the ClientDir."""
|
||||
extract_item('ProduKey', silent=True)
|
||||
|
|
@ -107,5 +113,8 @@ def run_produkey():
|
|||
log_file]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
from functions.common import *
|
||||
|
||||
|
||||
def run_chkdsk(repair=False):
|
||||
"""Run CHKDSK scan or schedule offline repairs."""
|
||||
if repair:
|
||||
|
|
@ -9,6 +10,7 @@ def run_chkdsk(repair=False):
|
|||
else:
|
||||
run_chkdsk_scan()
|
||||
|
||||
|
||||
def run_chkdsk_scan():
|
||||
"""Run CHKDSK in a "split window" and report errors."""
|
||||
if global_vars['OS']['Version'] in ('8', '8.1', '10'):
|
||||
|
|
@ -32,6 +34,7 @@ def run_chkdsk_scan():
|
|||
for line in out.stdout.decode().splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
|
||||
|
||||
def run_chkdsk_offline():
|
||||
"""Set filesystem 'dirty bit' to force a chkdsk during next boot."""
|
||||
cmd = [
|
||||
|
|
@ -42,8 +45,9 @@ def run_chkdsk_offline():
|
|||
if int(out.returncode) > 0:
|
||||
raise GenericError
|
||||
|
||||
|
||||
def run_dism(repair=False):
|
||||
"""Run DISM /RestoreHealth, then /CheckHealth, and then report errors."""
|
||||
"""Run DISM to either scan or repair component store health."""
|
||||
if global_vars['OS']['Version'] in ('8', '8.1', '10'):
|
||||
if repair:
|
||||
# Restore Health
|
||||
|
|
@ -75,6 +79,7 @@ def run_dism(repair=False):
|
|||
else:
|
||||
raise UnsupportedOSError
|
||||
|
||||
|
||||
def run_kvrt():
|
||||
"""Run KVRT."""
|
||||
extract_item('KVRT', silent=True)
|
||||
|
|
@ -86,6 +91,7 @@ def run_kvrt():
|
|||
'-processlevel', '3']
|
||||
popen_program(cmd, pipe=False)
|
||||
|
||||
|
||||
def run_sfc_scan():
|
||||
"""Run SFC in a "split window" and report errors."""
|
||||
cmd = [
|
||||
|
|
@ -109,6 +115,7 @@ def run_sfc_scan():
|
|||
else:
|
||||
raise GenericError
|
||||
|
||||
|
||||
def run_tdsskiller():
|
||||
"""Run TDSSKiller."""
|
||||
extract_item('TDSSKiller', silent=True)
|
||||
|
|
@ -122,5 +129,8 @@ def run_tdsskiller():
|
|||
'-dcexact', '-tdlfs']
|
||||
run_program(cmd, pipe=False)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -2,19 +2,23 @@
|
|||
|
||||
from functions.common import *
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
||||
|
||||
|
||||
def disable_safemode_msi():
|
||||
"""Disable MSI access under safemode."""
|
||||
cmd = ['reg', 'delete', REG_MSISERVER, '/f']
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def disable_safemode():
|
||||
"""Edit BCD to remove safeboot value."""
|
||||
cmd = ['bcdedit', '/deletevalue', '{default}', 'safeboot']
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def enable_safemode_msi():
|
||||
"""Enable MSI access under safemode."""
|
||||
cmd = ['reg', 'add', REG_MSISERVER, '/f']
|
||||
|
|
@ -23,14 +27,19 @@ def enable_safemode_msi():
|
|||
'/t', 'REG_SZ', '/d', 'Service', '/f']
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def enable_safemode():
|
||||
"""Edit BCD to set safeboot as default."""
|
||||
cmd = ['bcdedit', '/set', '{default}', 'safeboot', 'network']
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def reboot(delay=3):
|
||||
cmd = ['shutdown', '-r', '-t', '{}'.format(delay)]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
244
.bin/Scripts/functions/sensors.py
Normal file
244
.bin/Scripts/functions/sensors.py
Normal file
|
|
@ -0,0 +1,244 @@
|
|||
# Wizard Kit: Functions - Sensors
|
||||
|
||||
import json
|
||||
import re
|
||||
|
||||
from functions.tmux import *
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
TEMP_LIMITS = {
|
||||
'GREEN': 60,
|
||||
'YELLOW': 70,
|
||||
'ORANGE': 80,
|
||||
'RED': 90,
|
||||
}
|
||||
|
||||
|
||||
# REGEX
|
||||
REGEX_COLORS = re.compile(r'\033\[\d+;?1?m')
|
||||
|
||||
|
||||
def clear_temps(sensor_data):
|
||||
"""Clear saved temps but keep structure, returns dict."""
|
||||
for _section, _adapters in sensor_data.items():
|
||||
for _adapter, _sources in _adapters.items():
|
||||
for _source, _data in _sources.items():
|
||||
_data['Temps'] = []
|
||||
|
||||
|
||||
def fix_sensor_str(s):
|
||||
"""Cleanup string and return str."""
|
||||
s = re.sub(r'^(\w+)-(\w+)-(\w+)', r'\1 (\2 \3)', s, re.IGNORECASE)
|
||||
s = s.title()
|
||||
s = s.replace('Coretemp', 'CoreTemp')
|
||||
s = s.replace('Acpi', 'ACPI')
|
||||
s = s.replace('ACPItz', 'ACPI TZ')
|
||||
s = s.replace('Isa ', 'ISA ')
|
||||
s = s.replace('Id ', 'ID ')
|
||||
s = re.sub(r'(\D+)(\d+)', r'\1 \2', s, re.IGNORECASE)
|
||||
s = s.replace(' ', ' ')
|
||||
return s
|
||||
|
||||
|
||||
def generate_sensor_report(
|
||||
sensor_data, *temp_labels,
|
||||
colors=True, core_only=False):
|
||||
"""Generate report based on temp_labels, returns list if str."""
|
||||
report = []
|
||||
for _section, _adapters in sorted(sensor_data.items()):
|
||||
# CoreTemps then Other temps
|
||||
if core_only and 'Core' not in _section:
|
||||
continue
|
||||
for _adapter, _sources in sorted(_adapters.items()):
|
||||
# Adapter
|
||||
report.append(fix_sensor_str(_adapter))
|
||||
for _source, _data in sorted(_sources.items()):
|
||||
# Source
|
||||
_line = '{:18} '.format(fix_sensor_str(_source))
|
||||
# Temps (skip label for Current)
|
||||
for _label in temp_labels:
|
||||
_line += '{}{}{} '.format(
|
||||
_label.lower() if _label != 'Current' else '',
|
||||
': ' if _label != 'Current' else '',
|
||||
get_temp_str(_data.get(_label, '???'), colors=colors))
|
||||
report.append(_line)
|
||||
if not core_only:
|
||||
report.append(' ')
|
||||
|
||||
# Handle empty reports (i.e. no sensors detected)
|
||||
if not report:
|
||||
report = [
|
||||
'{}WARNING: No sensors found{}'.format(
|
||||
COLORS['YELLOW'] if colors else '',
|
||||
COLORS['CLEAR'] if colors else ''),
|
||||
' ',
|
||||
'Please monitor temps manually']
|
||||
|
||||
# Done
|
||||
return report
|
||||
|
||||
|
||||
def get_colored_temp_str(temp):
|
||||
"""Get colored string based on temp, returns str."""
|
||||
try:
|
||||
temp = float(temp)
|
||||
except ValueError:
|
||||
return '{YELLOW}{temp}{CLEAR}'.format(temp=temp, **COLORS)
|
||||
if temp > TEMP_LIMITS['RED']:
|
||||
color = COLORS['RED']
|
||||
elif temp > TEMP_LIMITS['ORANGE']:
|
||||
color = COLORS['ORANGE']
|
||||
elif temp > TEMP_LIMITS['YELLOW']:
|
||||
color = COLORS['YELLOW']
|
||||
elif temp > TEMP_LIMITS['GREEN']:
|
||||
color = COLORS['GREEN']
|
||||
elif temp > 0:
|
||||
color = COLORS['BLUE']
|
||||
else:
|
||||
color = COLORS['CLEAR']
|
||||
return '{color}{prefix}{temp:2.0f}°C{CLEAR}'.format(
|
||||
color = color,
|
||||
prefix = '-' if temp < 0 else '',
|
||||
temp = temp,
|
||||
**COLORS)
|
||||
|
||||
|
||||
def get_raw_sensor_data():
|
||||
"""Read sensor data and return dict."""
|
||||
data = {}
|
||||
cmd = ['sensors', '-j']
|
||||
|
||||
# Get raw data
|
||||
try:
|
||||
result = run_program(cmd)
|
||||
result = result.stdout.decode().splitlines()
|
||||
except subprocess.CalledProcessError:
|
||||
# Assuming no sensors available, set to empty list
|
||||
result = []
|
||||
|
||||
# Workaround for bad sensors
|
||||
raw_data = []
|
||||
for line in result:
|
||||
if line.strip() == ',':
|
||||
# Assuming malformatted line caused by missing data
|
||||
continue
|
||||
raw_data.append(line)
|
||||
|
||||
# Parse JSON data
|
||||
try:
|
||||
json_data = json.loads('\n'.join(raw_data))
|
||||
except json.JSONDecodeError:
|
||||
# Still broken, just set to empty dict
|
||||
json_data = {}
|
||||
|
||||
# Done
|
||||
return json_data
|
||||
|
||||
|
||||
def get_sensor_data():
|
||||
"""Parse raw sensor data and return new dict."""
|
||||
json_data = get_raw_sensor_data()
|
||||
sensor_data = {'CoreTemps': {}, 'Other': {}}
|
||||
for _adapter, _sources in json_data.items():
|
||||
if 'coretemp' in _adapter:
|
||||
_section = 'CoreTemps'
|
||||
else:
|
||||
_section = 'Other'
|
||||
sensor_data[_section][_adapter] = {}
|
||||
_sources.pop('Adapter', None)
|
||||
|
||||
# Find current temp and add to dict
|
||||
## current temp is labeled xxxx_input
|
||||
for _source, _labels in _sources.items():
|
||||
for _label, _temp in _labels.items():
|
||||
if _label.startswith('fan'):
|
||||
# Skip fan RPMs
|
||||
continue
|
||||
if 'input' in _label:
|
||||
sensor_data[_section][_adapter][_source] = {
|
||||
'Current': _temp,
|
||||
'Label': _label,
|
||||
'Max': _temp,
|
||||
'Temps': [_temp],
|
||||
}
|
||||
|
||||
# Remove empty sections
|
||||
for k, v in sensor_data.items():
|
||||
v = {k2: v2 for k2, v2 in v.items() if v2}
|
||||
|
||||
# Done
|
||||
return sensor_data
|
||||
|
||||
|
||||
def get_temp_str(temp, colors=True):
|
||||
"""Get temp string, returns str."""
|
||||
if colors:
|
||||
return get_colored_temp_str(temp)
|
||||
try:
|
||||
temp = float(temp)
|
||||
except ValueError:
|
||||
return '{}'.format(temp)
|
||||
else:
|
||||
return '{}{:2.0f}°C'.format(
|
||||
'-' if temp < 0 else '',
|
||||
temp)
|
||||
|
||||
|
||||
def monitor_sensors(monitor_pane, monitor_file):
|
||||
"""Continually update sensor data and report to screen."""
|
||||
sensor_data = get_sensor_data()
|
||||
while True:
|
||||
update_sensor_data(sensor_data)
|
||||
with open(monitor_file, 'w') as f:
|
||||
report = generate_sensor_report(sensor_data, 'Current', 'Max')
|
||||
f.write('\n'.join(report))
|
||||
sleep(1)
|
||||
if monitor_pane and not tmux_poll_pane(monitor_pane):
|
||||
break
|
||||
|
||||
|
||||
def save_average_temp(sensor_data, temp_label, seconds=10):
|
||||
"""Save average temps under temp_label, returns dict."""
|
||||
clear_temps(sensor_data)
|
||||
|
||||
# Get temps
|
||||
for i in range(seconds):
|
||||
update_sensor_data(sensor_data)
|
||||
sleep(1)
|
||||
|
||||
# Calculate averages
|
||||
for _section, _adapters in sensor_data.items():
|
||||
for _adapter, _sources in _adapters.items():
|
||||
for _source, _data in _sources.items():
|
||||
_data[temp_label] = sum(_data['Temps']) / len(_data['Temps'])
|
||||
|
||||
|
||||
def update_sensor_data(sensor_data):
|
||||
"""Read sensors and update existing sensor_data, returns dict."""
|
||||
json_data = get_raw_sensor_data()
|
||||
for _section, _adapters in sensor_data.items():
|
||||
for _adapter, _sources in _adapters.items():
|
||||
for _source, _data in _sources.items():
|
||||
try:
|
||||
_label = _data['Label']
|
||||
_temp = json_data[_adapter][_source][_label]
|
||||
_data['Current'] = _temp
|
||||
_data['Max'] = max(_temp, _data['Max'])
|
||||
_data['Temps'].append(_temp)
|
||||
except Exception:
|
||||
# Dumb workound for Dell sensors with changing source names
|
||||
pass
|
||||
|
||||
|
||||
def join_columns(column1, column2, width=55):
|
||||
return '{:<{}}{}'.format(
|
||||
column1,
|
||||
55+len(column1)-len(REGEX_COLORS.sub('', column1)),
|
||||
column2)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
# Wizard Kit: Functions - Setup
|
||||
|
||||
from functions.common import *
|
||||
from functions.update import *
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
HKU = winreg.HKEY_USERS
|
||||
HKCR = winreg.HKEY_CLASSES_ROOT
|
||||
|
|
@ -128,6 +128,7 @@ VCR_REDISTS = [
|
|||
'/passive', '/norestart']},
|
||||
]
|
||||
|
||||
|
||||
def config_classicstart():
|
||||
"""Configure ClassicStart."""
|
||||
# User level, not system level
|
||||
|
|
@ -180,14 +181,17 @@ def config_classicstart():
|
|||
sleep(1)
|
||||
popen_program(cs_exe)
|
||||
|
||||
|
||||
def config_explorer_system():
|
||||
"""Configure Windows Explorer for all users via Registry settings."""
|
||||
"""Configure Windows Explorer for all users."""
|
||||
write_registry_settings(SETTINGS_EXPLORER_SYSTEM, all_users=True)
|
||||
|
||||
|
||||
def config_explorer_user():
|
||||
"""Configure Windows Explorer for current user via Registry settings."""
|
||||
"""Configure Windows Explorer for current user."""
|
||||
write_registry_settings(SETTINGS_EXPLORER_USER, all_users=False)
|
||||
|
||||
|
||||
def disable_windows_telemetry():
|
||||
"""Disable Windows 10 telemetry settings with O&O ShutUp10."""
|
||||
extract_item('ShutUp10', silent=True)
|
||||
|
|
@ -197,6 +201,7 @@ def disable_windows_telemetry():
|
|||
'/quiet']
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def update_clock():
|
||||
"""Set Timezone and sync clock."""
|
||||
run_program(['tzutil' ,'/s', WINDOWS_TIME_ZONE], check=False)
|
||||
|
|
@ -209,6 +214,7 @@ def update_clock():
|
|||
run_program(['net', 'start', 'w32ime'], check=False)
|
||||
run_program(['w32tm', '/resync', '/nowait'], check=False)
|
||||
|
||||
|
||||
def write_registry_settings(settings, all_users=False):
|
||||
"""Write registry values from custom dict of dicts."""
|
||||
hive = HKCU
|
||||
|
|
@ -228,6 +234,7 @@ def write_registry_settings(settings, all_users=False):
|
|||
for name, value in v.get('SZ Items', {}).items():
|
||||
winreg.SetValueEx(key, name, 0, winreg.REG_SZ, value)
|
||||
|
||||
|
||||
# Installations
|
||||
def install_adobe_reader():
|
||||
"""Install Adobe Reader."""
|
||||
|
|
@ -240,10 +247,12 @@ def install_adobe_reader():
|
|||
'EULA_ACCEPT=YES']
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def install_chrome_extensions():
|
||||
"""Update registry to install Google Chrome extensions for all users."""
|
||||
"""Install Google Chrome extensions for all users."""
|
||||
write_registry_settings(SETTINGS_GOOGLE_CHROME, all_users=True)
|
||||
|
||||
|
||||
def install_classicstart_skin():
|
||||
"""Extract ClassicStart skin to installation folder."""
|
||||
if global_vars['OS']['Version'] not in ('8', '8.1', '10'):
|
||||
|
|
@ -257,8 +266,9 @@ def install_classicstart_skin():
|
|||
os.makedirs(dest_path, exist_ok=True)
|
||||
shutil.copy(source, dest)
|
||||
|
||||
|
||||
def install_firefox_extensions():
|
||||
"""Update registry to install Firefox extensions for all users."""
|
||||
"""Install Firefox extensions for all users."""
|
||||
dist_path = r'{PROGRAMFILES}\Mozilla Firefox\distribution\extensions'.format(
|
||||
**global_vars['Env'])
|
||||
source_path = r'{CBinDir}\FirefoxExtensions.7z'.format(**global_vars)
|
||||
|
|
@ -277,20 +287,34 @@ def install_firefox_extensions():
|
|||
source_path]
|
||||
run_program(cmd)
|
||||
|
||||
def install_ninite_bundle(mse=False):
|
||||
"""Run Ninite file(s) based on OS version."""
|
||||
|
||||
def install_ninite_bundle(mse=False, libreoffice=False):
|
||||
"""Run Ninite installer(s), returns list of Popen objects."""
|
||||
popen_objects = []
|
||||
if global_vars['OS']['Version'] in ('8', '8.1', '10'):
|
||||
# Modern selection
|
||||
popen_objects.append(
|
||||
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Modern.exe'.format(
|
||||
**global_vars))
|
||||
**global_vars)))
|
||||
else:
|
||||
# Legacy selection
|
||||
if mse:
|
||||
cmd = r'{BaseDir}\Installers\Extras\Security'.format(**global_vars)
|
||||
cmd += r'\Microsoft Security Essentials.exe'
|
||||
popen_program(cmd)
|
||||
popen_objects.append(popen_program(cmd))
|
||||
popen_objects.append(
|
||||
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Legacy.exe'.format(
|
||||
**global_vars))
|
||||
**global_vars)))
|
||||
|
||||
# LibreOffice
|
||||
if libreoffice:
|
||||
cmd = r'{BaseDir}\Installers\Extras\Office'.format(**global_vars)
|
||||
cmd += r'\LibreOffice.exe'
|
||||
popen_objects.append(popen_program(cmd))
|
||||
|
||||
# Done
|
||||
return popen_objects
|
||||
|
||||
|
||||
def install_vcredists():
|
||||
"""Install all supported Visual C++ runtimes."""
|
||||
|
|
@ -307,15 +331,21 @@ def install_vcredists():
|
|||
|
||||
os.chdir(prev_dir)
|
||||
|
||||
|
||||
# Misc
|
||||
def open_device_manager():
|
||||
popen_program(['mmc', 'devmgmt.msc'])
|
||||
|
||||
|
||||
def open_windows_activation():
|
||||
popen_program(['slui'])
|
||||
|
||||
|
||||
def open_windows_updates():
|
||||
popen_program(['control', '/name', 'Microsoft.WindowsUpdate'])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
231
.bin/Scripts/functions/sw_diags.py
Normal file
231
.bin/Scripts/functions/sw_diags.py
Normal file
|
|
@ -0,0 +1,231 @@
|
|||
# Wizard Kit: Functions - Diagnostics
|
||||
|
||||
import ctypes
|
||||
|
||||
from functions.common import *
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
AUTORUNS_SETTINGS = {
|
||||
r'Software\Sysinternals\AutoRuns': {
|
||||
'checkvirustotal': 1,
|
||||
'EulaAccepted': 1,
|
||||
'shownomicrosoft': 1,
|
||||
'shownowindows': 1,
|
||||
'showonlyvirustotal': 1,
|
||||
'submitvirustotal': 0,
|
||||
'verifysignatures': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\SigCheck': {
|
||||
'EulaAccepted': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\Streams': {
|
||||
'EulaAccepted': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\VirusTotal': {
|
||||
'VirusTotalTermsAccepted': 1,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def check_connection():
|
||||
"""Check if the system is online and optionally abort the script."""
|
||||
while True:
|
||||
result = try_and_print(message='Ping test...', function=ping, cs='OK')
|
||||
if result['CS']:
|
||||
break
|
||||
if not ask('ERROR: System appears offline, try again?'):
|
||||
if ask('Continue anyway?'):
|
||||
break
|
||||
else:
|
||||
abort()
|
||||
|
||||
|
||||
def check_secure_boot_status(show_alert=False):
|
||||
"""Checks UEFI Secure Boot status via PowerShell."""
|
||||
boot_mode = get_boot_mode()
|
||||
cmd = ['PowerShell', '-Command', 'Confirm-SecureBootUEFI']
|
||||
result = run_program(cmd, check=False)
|
||||
|
||||
# Check results
|
||||
if result.returncode == 0:
|
||||
out = result.stdout.decode()
|
||||
if 'True' in out:
|
||||
# It's on, do nothing
|
||||
return
|
||||
elif 'False' in out:
|
||||
if show_alert:
|
||||
show_alert_box('Secure Boot DISABLED')
|
||||
raise SecureBootDisabledError
|
||||
else:
|
||||
if show_alert:
|
||||
show_alert_box('Secure Boot status UNKNOWN')
|
||||
raise SecureBootUnknownError
|
||||
else:
|
||||
if boot_mode != 'UEFI':
|
||||
if (show_alert and
|
||||
global_vars['OS']['Version'] in ('8', '8.1', '10')):
|
||||
# OS supports Secure Boot
|
||||
show_alert_box('Secure Boot DISABLED\n\nOS installed LEGACY')
|
||||
raise OSInstalledLegacyError
|
||||
else:
|
||||
# Check error message
|
||||
err = result.stderr.decode()
|
||||
if 'Cmdlet not supported' in err:
|
||||
if show_alert:
|
||||
show_alert_box('Secure Boot UNAVAILABLE?')
|
||||
raise SecureBootNotAvailError
|
||||
else:
|
||||
if show_alert:
|
||||
show_alert_box('Secure Boot ERROR')
|
||||
raise GenericError
|
||||
|
||||
|
||||
def get_boot_mode():
|
||||
"""Check if Windows is booted in UEFI or Legacy mode, returns str."""
|
||||
kernel = ctypes.windll.kernel32
|
||||
firmware_type = ctypes.c_uint()
|
||||
|
||||
# Get value from kernel32 API
|
||||
try:
|
||||
kernel.GetFirmwareType(ctypes.byref(firmware_type))
|
||||
except:
|
||||
# Just set to zero
|
||||
firmware_type = ctypes.c_uint(0)
|
||||
|
||||
# Set return value
|
||||
type_str = 'Unknown'
|
||||
if firmware_type.value == 1:
|
||||
type_str = 'Legacy'
|
||||
elif firmware_type.value == 2:
|
||||
type_str = 'UEFI'
|
||||
|
||||
return type_str
|
||||
|
||||
|
||||
def os_is_unsupported(show_alert=False):
|
||||
"""Checks if the current OS is unsupported, returns bool."""
|
||||
msg = ''
|
||||
unsupported = False
|
||||
|
||||
# Check OS version/notes
|
||||
os_info = global_vars['OS'].copy()
|
||||
if os_info['Notes'] == 'unsupported':
|
||||
msg = 'The installed version of Windows is no longer supported'
|
||||
unsupported = True
|
||||
elif os_info['Notes'] == 'preview build':
|
||||
msg = 'Preview builds are not officially supported'
|
||||
unsupported = True
|
||||
elif os_info['Version'] == '10' and os_info['Notes'] == 'outdated':
|
||||
msg = 'The installed version of Windows is outdated'
|
||||
unsupported = True
|
||||
if 'Preview' not in msg:
|
||||
msg += '\n\nPlease consider upgrading before continuing setup.'
|
||||
|
||||
# Show alert
|
||||
if unsupported and show_alert:
|
||||
show_alert_box(msg)
|
||||
|
||||
# Done
|
||||
return unsupported
|
||||
|
||||
|
||||
def run_autoruns():
|
||||
"""Run AutoRuns in the background with VirusTotal checks enabled."""
|
||||
extract_item('Autoruns', filter='autoruns*', silent=True)
|
||||
# Update AutoRuns settings before running
|
||||
for path, settings in AUTORUNS_SETTINGS.items():
|
||||
winreg.CreateKey(HKCU, path)
|
||||
with winreg.OpenKey(HKCU, path, access=winreg.KEY_WRITE) as key:
|
||||
for name, value in settings.items():
|
||||
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
|
||||
popen_program(global_vars['Tools']['AutoRuns'], minimized=True)
|
||||
|
||||
|
||||
def run_hwinfo_sensors():
|
||||
"""Run HWiNFO sensors."""
|
||||
path = r'{BinDir}\HWiNFO'.format(**global_vars)
|
||||
for bit in [32, 64]:
|
||||
# Configure
|
||||
source = r'{}\general.ini'.format(path)
|
||||
dest = r'{}\HWiNFO{}.ini'.format(path, bit)
|
||||
shutil.copy(source, dest)
|
||||
with open(dest, 'a') as f:
|
||||
f.write('SensorsOnly=1\n')
|
||||
f.write('SummaryOnly=0\n')
|
||||
popen_program(global_vars['Tools']['HWiNFO'])
|
||||
|
||||
|
||||
def run_nircmd(*cmd):
|
||||
"""Run custom NirCmd."""
|
||||
extract_item('NirCmd', silent=True)
|
||||
cmd = [global_vars['Tools']['NirCmd'], *cmd]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
|
||||
def run_xmplay():
|
||||
"""Run XMPlay to test audio."""
|
||||
extract_item('XMPlay', silent=True)
|
||||
cmd = [global_vars['Tools']['XMPlay'],
|
||||
r'{BinDir}\XMPlay\music.7z'.format(**global_vars)]
|
||||
|
||||
# Unmute audio first
|
||||
extract_item('NirCmd', silent=True)
|
||||
run_nircmd('mutesysvolume', '0')
|
||||
|
||||
# Open XMPlay
|
||||
popen_program(cmd)
|
||||
|
||||
|
||||
def run_hitmanpro():
|
||||
"""Run HitmanPro in the background."""
|
||||
extract_item('HitmanPro', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['HitmanPro'],
|
||||
'/quiet', '/noinstall', '/noupload',
|
||||
r'/log={LogDir}\Tools\HitmanPro.txt'.format(**global_vars)]
|
||||
popen_program(cmd)
|
||||
|
||||
|
||||
def run_process_killer():
|
||||
"""Kill most running processes skipping those in the whitelist.txt."""
|
||||
# borrowed from TronScript (reddit.com/r/TronScript)
|
||||
# credit to /u/cuddlychops06
|
||||
prev_dir = os.getcwd()
|
||||
extract_item('ProcessKiller', silent=True)
|
||||
os.chdir(r'{BinDir}\ProcessKiller'.format(**global_vars))
|
||||
run_program(['ProcessKiller.exe', '/silent'], check=False)
|
||||
os.chdir(prev_dir)
|
||||
|
||||
|
||||
def run_rkill():
|
||||
"""Run RKill and cleanup afterwards."""
|
||||
extract_item('RKill', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['RKill'],
|
||||
'-s', '-l', r'{LogDir}\Tools\RKill.log'.format(**global_vars),
|
||||
'-new_console:n', '-new_console:s33V']
|
||||
run_program(cmd, check=False)
|
||||
wait_for_process('RKill')
|
||||
|
||||
# RKill cleanup
|
||||
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
|
||||
if os.path.exists(desktop_path):
|
||||
for item in os.scandir(desktop_path):
|
||||
if re.search(r'^RKill', item.name, re.IGNORECASE):
|
||||
dest = r'{LogDir}\Tools\{name}'.format(
|
||||
name=dest, **global_vars)
|
||||
dest = non_clobber_rename(dest)
|
||||
shutil.move(item.path, dest)
|
||||
|
||||
|
||||
def show_alert_box(message, title='Wizard Kit Warning'):
|
||||
"""Show Windows alert box with message."""
|
||||
message_box = ctypes.windll.user32.MessageBoxW
|
||||
message_box(None, message, title, 0x00001030)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
47
.bin/Scripts/functions/threading.py
Normal file
47
.bin/Scripts/functions/threading.py
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
# Wizard Kit: Functions - Threading
|
||||
|
||||
from threading import Thread
|
||||
from queue import Queue, Empty
|
||||
|
||||
# Classes
|
||||
class NonBlockingStreamReader():
|
||||
"""Class to allow non-blocking reads from a stream."""
|
||||
# Credits:
|
||||
## https://gist.github.com/EyalAr/7915597
|
||||
## https://stackoverflow.com/a/4896288
|
||||
|
||||
def __init__(self, stream):
|
||||
self.stream = stream
|
||||
self.queue = Queue()
|
||||
|
||||
def populate_queue(stream, queue):
|
||||
"""Collect lines from stream and put them in queue."""
|
||||
while True:
|
||||
line = stream.read(1)
|
||||
if line:
|
||||
queue.put(line)
|
||||
|
||||
self.thread = start_thread(
|
||||
populate_queue,
|
||||
args=(self.stream, self.queue))
|
||||
|
||||
def read(self, timeout=None):
|
||||
try:
|
||||
return self.queue.get(block = timeout is not None,
|
||||
timeout = timeout)
|
||||
except Empty:
|
||||
return None
|
||||
|
||||
|
||||
# Functions
|
||||
def start_thread(function, args=[], daemon=True):
|
||||
"""Run function as thread in background, returns Thread object."""
|
||||
thread = Thread(target=function, args=args, daemon=daemon)
|
||||
thread.start()
|
||||
return thread
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
160
.bin/Scripts/functions/tmux.py
Normal file
160
.bin/Scripts/functions/tmux.py
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
# Wizard Kit: Functions - tmux
|
||||
|
||||
from functions.common import *
|
||||
|
||||
|
||||
def create_file(filepath):
|
||||
"""Create file if it doesn't exist."""
|
||||
if not os.path.exists(filepath):
|
||||
with open(filepath, 'w') as f:
|
||||
f.write('')
|
||||
|
||||
|
||||
def tmux_get_pane_size(pane_id=None):
|
||||
"""Get target, or current, pane size, returns tuple."""
|
||||
x = -1
|
||||
y = -1
|
||||
cmd = ['tmux', 'display', '-p']
|
||||
if pane_id:
|
||||
cmd.extend(['-t', pane_id])
|
||||
cmd.append('#{pane_width} #{pane_height}')
|
||||
|
||||
# Run cmd and set x & y
|
||||
result = run_program(cmd, check=False)
|
||||
try:
|
||||
x, y = result.stdout.decode().strip().split()
|
||||
x = int(x)
|
||||
y = int(y)
|
||||
except Exception:
|
||||
# Ignore and return unrealistic values
|
||||
pass
|
||||
|
||||
return (x, y)
|
||||
|
||||
|
||||
def tmux_kill_all_panes(pane_id=None):
|
||||
"""Kill all tmux panes except the active pane or pane_id if specified."""
|
||||
cmd = ['tmux', 'kill-pane', '-a']
|
||||
if pane_id:
|
||||
cmd.extend(['-t', pane_id])
|
||||
run_program(cmd, check=False)
|
||||
|
||||
|
||||
def tmux_kill_pane(*panes):
|
||||
"""Kill tmux pane by id."""
|
||||
cmd = ['tmux', 'kill-pane', '-t']
|
||||
for pane_id in panes:
|
||||
if not pane_id:
|
||||
# Skip empty strings, None values, etc
|
||||
continue
|
||||
run_program(cmd+[pane_id], check=False)
|
||||
|
||||
|
||||
def tmux_poll_pane(pane_id):
|
||||
"""Check if pane exists, returns bool."""
|
||||
cmd = ['tmux', 'list-panes', '-F', '#D']
|
||||
result = run_program(cmd, check=False)
|
||||
panes = result.stdout.decode().splitlines()
|
||||
return pane_id in panes
|
||||
|
||||
|
||||
def tmux_resize_pane(pane_id=None, x=None, y=None, **kwargs):
|
||||
"""Resize pane to specific hieght or width."""
|
||||
if not x and not y:
|
||||
raise Exception('Neither height nor width specified.')
|
||||
|
||||
cmd = ['tmux', 'resize-pane']
|
||||
if pane_id:
|
||||
# NOTE: If pane_id not specified then the current pane will be resized
|
||||
cmd.extend(['-t', pane_id])
|
||||
if x:
|
||||
cmd.extend(['-x', str(x)])
|
||||
elif y:
|
||||
cmd.extend(['-y', str(y)])
|
||||
|
||||
run_program(cmd, check=False)
|
||||
|
||||
|
||||
def tmux_split_window(
|
||||
lines=None, percent=None,
|
||||
behind=False, vertical=False,
|
||||
follow=False, target_pane=None,
|
||||
command=None, working_dir=None,
|
||||
text=None, watch=None, watch_cmd='cat'):
|
||||
"""Run tmux split-window command and return pane_id as str."""
|
||||
# Bail early
|
||||
if not lines and not percent:
|
||||
raise Exception('Neither lines nor percent specified.')
|
||||
if not command and not text and not watch:
|
||||
raise Exception('No command, text, or watch file specified.')
|
||||
|
||||
# Build cmd
|
||||
cmd = ['tmux', 'split-window', '-PF', '#D']
|
||||
if behind:
|
||||
cmd.append('-b')
|
||||
if vertical:
|
||||
cmd.append('-v')
|
||||
else:
|
||||
cmd.append('-h')
|
||||
if not follow:
|
||||
cmd.append('-d')
|
||||
if lines is not None:
|
||||
cmd.extend(['-l', str(lines)])
|
||||
elif percent is not None:
|
||||
cmd.extend(['-p', str(percent)])
|
||||
if target_pane:
|
||||
cmd.extend(['-t', str(target_pane)])
|
||||
|
||||
if working_dir:
|
||||
cmd.extend(['-c', working_dir])
|
||||
if command:
|
||||
cmd.extend(command)
|
||||
elif text:
|
||||
cmd.extend(['echo-and-hold "{}"'.format(text)])
|
||||
elif watch:
|
||||
create_file(watch)
|
||||
if watch_cmd == 'cat':
|
||||
cmd.extend([
|
||||
'watch', '--color', '--no-title',
|
||||
'--interval', '1',
|
||||
'cat', watch])
|
||||
elif watch_cmd == 'tail':
|
||||
cmd.extend(['tail', '-f', watch])
|
||||
|
||||
# Run and return pane_id
|
||||
result = run_program(cmd)
|
||||
return result.stdout.decode().strip()
|
||||
|
||||
|
||||
def tmux_update_pane(
|
||||
pane_id, command=None, working_dir=None,
|
||||
text=None, watch=None, watch_cmd='cat'):
|
||||
"""Respawn with either a new command or new text."""
|
||||
# Bail early
|
||||
if not command and not text and not watch:
|
||||
raise Exception('No command, text, or watch file specified.')
|
||||
|
||||
cmd = ['tmux', 'respawn-pane', '-k', '-t', pane_id]
|
||||
if working_dir:
|
||||
cmd.extend(['-c', working_dir])
|
||||
if command:
|
||||
cmd.extend(command)
|
||||
elif text:
|
||||
cmd.extend(['echo-and-hold "{}"'.format(text)])
|
||||
elif watch:
|
||||
create_file(watch)
|
||||
if watch_cmd == 'cat':
|
||||
cmd.extend([
|
||||
'watch', '--color', '--no-title',
|
||||
'--interval', '1',
|
||||
'cat', watch])
|
||||
elif watch_cmd == 'tail':
|
||||
cmd.extend(['tail', '-f', watch])
|
||||
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
@ -2,12 +2,12 @@
|
|||
|
||||
import requests
|
||||
|
||||
from functions.common import *
|
||||
from functions.data import *
|
||||
from settings.launchers import *
|
||||
from settings.music import *
|
||||
from settings.sources import *
|
||||
|
||||
|
||||
def compress_and_remove_item(item):
|
||||
"""Compress and delete an item unless an error is encountered."""
|
||||
try:
|
||||
|
|
@ -17,6 +17,7 @@ def compress_and_remove_item(item):
|
|||
else:
|
||||
remove_item(item.path)
|
||||
|
||||
|
||||
def compress_item(item):
|
||||
"""Compress an item in a 7-Zip archive using the ARCHIVE_PASSWORD."""
|
||||
# Prep
|
||||
|
|
@ -42,6 +43,7 @@ def compress_item(item):
|
|||
# Done
|
||||
os.chdir(prev_dir)
|
||||
|
||||
|
||||
def download_generic(out_dir, out_name, source_url):
|
||||
"""Downloads a file using requests."""
|
||||
## Code based on this Q&A: https://stackoverflow.com/q/16694907
|
||||
|
|
@ -59,10 +61,12 @@ def download_generic(out_dir, out_name, source_url):
|
|||
except:
|
||||
raise GenericError('Failed to download file.')
|
||||
|
||||
|
||||
def download_to_temp(out_name, source_url):
|
||||
"""Download a file to the TmpDir."""
|
||||
download_generic(global_vars['TmpDir'], out_name, source_url)
|
||||
|
||||
|
||||
def extract_generic(source, dest, mode='x', sz_args=[]):
|
||||
"""Extract a file to a destination."""
|
||||
cmd = [
|
||||
|
|
@ -73,12 +77,14 @@ def extract_generic(source, dest, mode='x', sz_args=[]):
|
|||
cmd.extend(sz_args)
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def extract_temp_to_bin(source, item, mode='x', sz_args=[]):
|
||||
"""Extract a file to the .bin folder."""
|
||||
source = r'{}\{}'.format(global_vars['TmpDir'], source)
|
||||
dest = r'{}\{}'.format(global_vars['BinDir'], item)
|
||||
extract_generic(source, dest, mode, sz_args)
|
||||
|
||||
|
||||
def extract_temp_to_cbin(source, item, mode='x', sz_args=[]):
|
||||
"""Extract a file to the .cbin folder."""
|
||||
source = r'{}\{}'.format(global_vars['TmpDir'], source)
|
||||
|
|
@ -88,6 +94,7 @@ def extract_temp_to_cbin(source, item, mode='x', sz_args=[]):
|
|||
shutil.copytree(include_path, dest)
|
||||
extract_generic(source, dest, mode, sz_args)
|
||||
|
||||
|
||||
def generate_launcher(section, name, options):
|
||||
"""Generate a launcher script."""
|
||||
# Prep
|
||||
|
|
@ -125,6 +132,7 @@ def generate_launcher(section, name, options):
|
|||
# f.writelines(out_text)
|
||||
f.write('\n'.join(out_text))
|
||||
|
||||
|
||||
def remove_item(item_path):
|
||||
"""Delete a file or folder."""
|
||||
if os.path.exists(item_path):
|
||||
|
|
@ -133,6 +141,7 @@ def remove_item(item_path):
|
|||
else:
|
||||
os.remove(item_path)
|
||||
|
||||
|
||||
def remove_from_kit(item):
|
||||
"""Delete a file or folder from the .bin/.cbin folders."""
|
||||
item_locations = []
|
||||
|
|
@ -144,11 +153,13 @@ def remove_from_kit(item):
|
|||
for item_path in item_locations:
|
||||
remove_item(item_path)
|
||||
|
||||
|
||||
def remove_from_temp(item):
|
||||
"""Delete a file or folder from the TmpDir folder."""
|
||||
item_path = r'{}\{}'.format(global_vars['TmpDir'], item)
|
||||
remove_item(item_path)
|
||||
|
||||
|
||||
def resolve_dynamic_url(source_url, regex):
|
||||
"""Scan source_url for a url using the regex provided; returns str."""
|
||||
# Load the download page
|
||||
|
|
@ -170,37 +181,8 @@ def resolve_dynamic_url(source_url, regex):
|
|||
# Return
|
||||
return url
|
||||
|
||||
def scan_for_net_installers(server, family_name, min_year):
|
||||
"""Scan network shares for installers."""
|
||||
if not server['Mounted']:
|
||||
mount_network_share(server)
|
||||
|
||||
if server['Mounted']:
|
||||
for year in os.scandir(r'\\{IP}\{Share}'.format(**server)):
|
||||
try:
|
||||
year_ok = int(year.name) < min_year
|
||||
except ValueError:
|
||||
year_ok = False # Skip non-year items
|
||||
if year_ok:
|
||||
# Don't support outdated installers
|
||||
continue
|
||||
for version in os.scandir(year.path):
|
||||
section = r'Installers\Extras\{}\{}'.format(
|
||||
family_name, year.name)
|
||||
if section not in LAUNCHERS:
|
||||
LAUNCHERS[section] = {}
|
||||
name = version.name
|
||||
if re.search(r'(exe|msi)$', name, re.IGNORECASE):
|
||||
name = name[:-4]
|
||||
if name not in LAUNCHERS[section]:
|
||||
LAUNCHERS[section][name] = {
|
||||
'L_TYPE': family_name,
|
||||
'L_PATH': year.name,
|
||||
'L_ITEM': version.name,
|
||||
}
|
||||
umount_network_share(server)
|
||||
|
||||
## Data Recovery ##
|
||||
# Data Recovery
|
||||
def update_testdisk():
|
||||
# Stop running processes
|
||||
for exe in ['fidentify_win.exe', 'photorec_win.exe',
|
||||
|
|
@ -226,7 +208,8 @@ def update_testdisk():
|
|||
# Cleanup
|
||||
remove_from_temp('testdisk_wip.zip')
|
||||
|
||||
## Data Transfers ##
|
||||
|
||||
# Data Transfers
|
||||
def update_fastcopy():
|
||||
## NOTE: Lives in .bin uncompressed
|
||||
# Stop running processes
|
||||
|
|
@ -236,35 +219,34 @@ def update_fastcopy():
|
|||
# Remove existing folders
|
||||
remove_from_kit('FastCopy')
|
||||
|
||||
# Download
|
||||
download_to_temp('FastCopy.zip', SOURCE_URLS['FastCopy'])
|
||||
|
||||
# Extract installer
|
||||
extract_temp_to_bin('FastCopy.zip', 'FastCopy')
|
||||
_path = r'{}\FastCopy'.format(global_vars['BinDir'])
|
||||
_installer = 'FastCopy354_installer.exe'
|
||||
|
||||
# Extract 64-bit
|
||||
cmd = [
|
||||
r'{}\{}'.format(_path, _installer),
|
||||
'/NOSUBDIR', '/DIR={}'.format(_path),
|
||||
'/EXTRACT64']
|
||||
run_program(cmd)
|
||||
shutil.move(
|
||||
r'{}\FastCopy\FastCopy.exe'.format(global_vars['BinDir']),
|
||||
r'{}\FastCopy\FastCopy64.exe'.format(global_vars['BinDir']))
|
||||
# Download installer
|
||||
download_to_temp('FastCopy.exe', SOURCE_URLS['FastCopy'])
|
||||
_installer = r'{}\FastCopy.exe'.format(global_vars['TmpDir'])
|
||||
|
||||
# Extract 32-bit
|
||||
_path32 = r'{}\FastCopy'.format(global_vars['BinDir'])
|
||||
cmd = [
|
||||
r'{}\{}'.format(_path, _installer),
|
||||
'/NOSUBDIR', '/DIR={}'.format(_path),
|
||||
_installer,
|
||||
'/NOSUBDIR', '/DIR={}'.format(_path32),
|
||||
'/EXTRACT32']
|
||||
run_program(cmd)
|
||||
|
||||
# Extract 64-bit
|
||||
_path64 = r'{}\FastCopyTmp'.format(global_vars['TmpDir'])
|
||||
cmd = [
|
||||
_installer,
|
||||
'/NOSUBDIR', '/DIR={}'.format(_path64),
|
||||
'/EXTRACT64']
|
||||
run_program(cmd)
|
||||
shutil.move(
|
||||
r'{}\FastCopy.exe'.format(_path64),
|
||||
r'{}\FastCopy64.exe'.format(_path32))
|
||||
|
||||
# Cleanup
|
||||
os.remove(r'{}\{}'.format(_path, _installer))
|
||||
os.remove(r'{}\setup.exe'.format(_path, _installer))
|
||||
remove_from_temp('FastCopy.zip')
|
||||
remove_item(r'{}\setup.exe'.format(_path32))
|
||||
remove_item(_path64)
|
||||
remove_from_temp('FastCopy.exe')
|
||||
|
||||
|
||||
def update_wimlib():
|
||||
# Stop running processes
|
||||
|
|
@ -289,6 +271,7 @@ def update_wimlib():
|
|||
remove_from_temp('wimlib32.zip')
|
||||
remove_from_temp('wimlib64.zip')
|
||||
|
||||
|
||||
def update_xyplorer():
|
||||
# Stop running processes
|
||||
kill_process('XYplorerFree.exe')
|
||||
|
|
@ -305,7 +288,8 @@ def update_xyplorer():
|
|||
# Cleanup
|
||||
remove_from_temp('xyplorer_free.zip')
|
||||
|
||||
## Diagnostics ##
|
||||
|
||||
# Diagnostics
|
||||
def update_aida64():
|
||||
# Stop running processes
|
||||
kill_process('notepadplusplus.exe')
|
||||
|
|
@ -322,6 +306,7 @@ def update_aida64():
|
|||
# Cleanup
|
||||
remove_from_temp('aida64.zip')
|
||||
|
||||
|
||||
def update_autoruns():
|
||||
# Stop running processes
|
||||
kill_process('Autoruns.exe')
|
||||
|
|
@ -339,6 +324,7 @@ def update_autoruns():
|
|||
# Cleanup
|
||||
remove_from_temp('Autoruns.zip')
|
||||
|
||||
|
||||
def update_bleachbit():
|
||||
# Stop running processes
|
||||
kill_process('bleachbit.exe')
|
||||
|
|
@ -370,6 +356,7 @@ def update_bleachbit():
|
|||
remove_from_temp('bleachbit.zip')
|
||||
remove_from_temp('Winapp2.zip')
|
||||
|
||||
|
||||
def update_bluescreenview():
|
||||
# Stop running processes
|
||||
for exe in ['BlueScreenView.exe', 'BlueScreenView64.exe']:
|
||||
|
|
@ -383,7 +370,8 @@ def update_bluescreenview():
|
|||
download_to_temp('bluescreenview64.zip', SOURCE_URLS['BlueScreenView64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('bluescreenview64.zip', 'BlueScreenView', sz_args=['BlueScreenView.exe'])
|
||||
extract_temp_to_cbin(
|
||||
'bluescreenview64.zip', 'BlueScreenView', sz_args=['BlueScreenView.exe'])
|
||||
shutil.move(
|
||||
r'{}\BlueScreenView\BlueScreenView.exe'.format(global_vars['CBinDir']),
|
||||
r'{}\BlueScreenView\BlueScreenView64.exe'.format(global_vars['CBinDir']))
|
||||
|
|
@ -393,6 +381,7 @@ def update_bluescreenview():
|
|||
remove_from_temp('bluescreenview32.zip')
|
||||
remove_from_temp('bluescreenview64.zip')
|
||||
|
||||
|
||||
def update_erunt():
|
||||
# Stop running processes
|
||||
kill_process('ERUNT.EXE')
|
||||
|
|
@ -409,6 +398,7 @@ def update_erunt():
|
|||
# Cleanup
|
||||
remove_from_temp('erunt.zip')
|
||||
|
||||
|
||||
def update_hitmanpro():
|
||||
# Stop running processes
|
||||
for exe in ['HitmanPro.exe', 'HitmanPro64.exe']:
|
||||
|
|
@ -422,6 +412,7 @@ def update_hitmanpro():
|
|||
download_generic(dest, 'HitmanPro.exe', SOURCE_URLS['HitmanPro32'])
|
||||
download_generic(dest, 'HitmanPro64.exe', SOURCE_URLS['HitmanPro64'])
|
||||
|
||||
|
||||
def update_hwinfo():
|
||||
## NOTE: Lives in .bin uncompressed
|
||||
# Stop running processes
|
||||
|
|
@ -437,6 +428,7 @@ def update_hwinfo():
|
|||
# Cleanup
|
||||
remove_from_temp('HWiNFO.zip')
|
||||
|
||||
|
||||
def update_nircmd():
|
||||
# Stop running processes
|
||||
for exe in ['nircmdc.exe', 'nircmdc64.exe']:
|
||||
|
|
@ -460,6 +452,7 @@ def update_nircmd():
|
|||
remove_from_temp('nircmd32.zip')
|
||||
remove_from_temp('nircmd64.zip')
|
||||
|
||||
|
||||
def update_produkey():
|
||||
# Stop running processes
|
||||
for exe in ['ProduKey.exe', 'ProduKey64.exe']:
|
||||
|
|
@ -483,7 +476,8 @@ def update_produkey():
|
|||
remove_from_temp('produkey32.zip')
|
||||
remove_from_temp('produkey64.zip')
|
||||
|
||||
## Drivers ##
|
||||
|
||||
# Drivers
|
||||
def update_intel_rst():
|
||||
# Remove existing folders
|
||||
remove_from_kit('Intel RST')
|
||||
|
|
@ -499,6 +493,7 @@ def update_intel_rst():
|
|||
for name, url in RST_SOURCES.items():
|
||||
download_generic(dest, name, url)
|
||||
|
||||
|
||||
def update_intel_ssd_toolbox():
|
||||
# Remove existing folders
|
||||
remove_from_kit('Intel SSD Toolbox.exe')
|
||||
|
|
@ -509,6 +504,7 @@ def update_intel_ssd_toolbox():
|
|||
'Intel SSD Toolbox.exe',
|
||||
SOURCE_URLS['Intel SSD Toolbox'])
|
||||
|
||||
|
||||
def update_samsung_magician():
|
||||
# Remove existing folders
|
||||
remove_from_kit('Samsung Magician.exe')
|
||||
|
|
@ -527,6 +523,7 @@ def update_samsung_magician():
|
|||
# Cleanup
|
||||
remove_from_temp('Samsung Magician.zip')
|
||||
|
||||
|
||||
def update_sdi_origin():
|
||||
# Download aria2
|
||||
download_to_temp('aria2.zip', SOURCE_URLS['aria2'])
|
||||
|
|
@ -542,7 +539,8 @@ def update_sdi_origin():
|
|||
indexes = []
|
||||
for line in out.stdout.decode().splitlines():
|
||||
r = re.search(r'^\s*(\d+)\|(.*)', line)
|
||||
if r and not re.search(r'(\.(bat|inf)|Video|Server|Printer|XP)', line, re.IGNORECASE):
|
||||
if (r and not re.search(
|
||||
r'(\.(bat|inf)|Video|Server|Printer|XP)', line, re.IGNORECASE)):
|
||||
indexes.append(int(r.group(1)))
|
||||
indexes = [str(i) for i in sorted(indexes)]
|
||||
|
||||
|
|
@ -583,7 +581,8 @@ def update_sdi_origin():
|
|||
remove_from_temp('sdio.torrent')
|
||||
remove_from_temp('sdio_themes.zip')
|
||||
|
||||
## Installers ##
|
||||
|
||||
# Installers
|
||||
def update_adobe_reader_dc():
|
||||
# Prep
|
||||
dest = r'{}\Installers\Extras\Office'.format(
|
||||
|
|
@ -599,6 +598,7 @@ def update_adobe_reader_dc():
|
|||
download_generic(
|
||||
dest, 'Adobe Reader DC.exe', SOURCE_URLS['Adobe Reader DC'])
|
||||
|
||||
|
||||
def update_macs_fan_control():
|
||||
# Prep
|
||||
dest = r'{}\Installers'.format(
|
||||
|
|
@ -614,6 +614,7 @@ def update_macs_fan_control():
|
|||
download_generic(
|
||||
dest, 'Macs Fan Control.exe', SOURCE_URLS['Macs Fan Control'])
|
||||
|
||||
|
||||
def update_office():
|
||||
# Remove existing folders
|
||||
remove_from_kit('_Office')
|
||||
|
|
@ -624,23 +625,23 @@ def update_office():
|
|||
if os.path.exists(include_path):
|
||||
shutil.copytree(include_path, dest)
|
||||
|
||||
for year in ['2016']:
|
||||
# Download and extract
|
||||
name = 'odt{}.exe'.format(year)
|
||||
url = 'Office Deployment Tool {}'.format(year)
|
||||
download_to_temp(name, SOURCE_URLS[url])
|
||||
_out_path = r'{}\odt'.format(global_vars['TmpDir'])
|
||||
download_to_temp('odt.exe', SOURCE_URLS['Office Deployment Tool'])
|
||||
cmd = [
|
||||
r'{}\odt{}.exe'.format(global_vars['TmpDir'], year),
|
||||
r'/extract:{}\{}'.format(global_vars['TmpDir'], year),
|
||||
r'{}\odt.exe'.format(global_vars['TmpDir']),
|
||||
r'/extract:{}'.format(_out_path),
|
||||
'/quiet',
|
||||
]
|
||||
run_program(cmd)
|
||||
shutil.move(
|
||||
r'{}\{}'.format(global_vars['TmpDir'], year),
|
||||
r'{}\_Office\{}'.format(global_vars['CBinDir'], year))
|
||||
r'{}\setup.exe'.format(_out_path),
|
||||
r'{}\_Office'.format(global_vars['CBinDir']))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('odt{}.exe'.format(year))
|
||||
remove_from_temp('odt')
|
||||
remove_from_temp('odt.exe')
|
||||
|
||||
|
||||
def update_classic_start_skin():
|
||||
# Remove existing folders
|
||||
|
|
@ -652,6 +653,7 @@ def update_classic_start_skin():
|
|||
'Metro-Win10-Black.skin7',
|
||||
SOURCE_URLS['ClassicStartSkin'])
|
||||
|
||||
|
||||
def update_vcredists():
|
||||
# Remove existing folders
|
||||
remove_from_kit('_vcredists')
|
||||
|
|
@ -672,6 +674,7 @@ def update_vcredists():
|
|||
'vcredist.exe',
|
||||
VCREDIST_SOURCES[year][bit])
|
||||
|
||||
|
||||
def update_one_ninite(section, dest, name, url, indent=8, width=40):
|
||||
# Prep
|
||||
url = 'https://ninite.com/{}/ninite.exe'.format(url)
|
||||
|
|
@ -688,6 +691,7 @@ def update_one_ninite(section, dest, name, url, indent=8, width=40):
|
|||
remove_item(installer_dest)
|
||||
shutil.copy(r'{}\{}'.format(dest, name), installer_dest)
|
||||
|
||||
|
||||
def update_all_ninite(indent=8, width=40, other_results={}):
|
||||
print_info('{}Ninite'.format(' '*int(indent/2)))
|
||||
for section in sorted(NINITE_SOURCES.keys()):
|
||||
|
|
@ -698,7 +702,8 @@ def update_all_ninite(indent=8, width=40, other_results={}):
|
|||
other_results=other_results, indent=indent, width=width,
|
||||
section=section, dest=dest, name=name, url=url)
|
||||
|
||||
## Misc ##
|
||||
|
||||
# Misc
|
||||
def update_caffeine():
|
||||
# Stop running processes
|
||||
kill_process('caffeine.exe')
|
||||
|
|
@ -715,6 +720,7 @@ def update_caffeine():
|
|||
# Cleanup
|
||||
remove_from_temp('caffeine.zip')
|
||||
|
||||
|
||||
def update_du():
|
||||
# Stop running processes
|
||||
kill_process('du.exe')
|
||||
|
|
@ -732,6 +738,7 @@ def update_du():
|
|||
# Cleanup
|
||||
remove_from_temp('du.zip')
|
||||
|
||||
|
||||
def update_everything():
|
||||
# Stop running processes
|
||||
for exe in ['Everything.exe', 'Everything64.exe']:
|
||||
|
|
@ -745,7 +752,8 @@ def update_everything():
|
|||
download_to_temp('everything64.zip', SOURCE_URLS['Everything64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('everything64.zip', 'Everything', sz_args=['Everything.exe'])
|
||||
extract_temp_to_cbin(
|
||||
'everything64.zip', 'Everything', sz_args=['Everything.exe'])
|
||||
shutil.move(
|
||||
r'{}\Everything\Everything.exe'.format(global_vars['CBinDir']),
|
||||
r'{}\Everything\Everything64.exe'.format(global_vars['CBinDir']))
|
||||
|
|
@ -755,6 +763,7 @@ def update_everything():
|
|||
remove_from_temp('everything32.zip')
|
||||
remove_from_temp('everything64.zip')
|
||||
|
||||
|
||||
def update_firefox_ublock_origin():
|
||||
# Remove existing folders
|
||||
remove_from_kit('FirefoxExtensions')
|
||||
|
|
@ -765,6 +774,7 @@ def update_firefox_ublock_origin():
|
|||
'ublock_origin.xpi',
|
||||
SOURCE_URLS['Firefox uBO'])
|
||||
|
||||
|
||||
def update_notepadplusplus():
|
||||
# Stop running processes
|
||||
kill_process('notepadplusplus.exe')
|
||||
|
|
@ -785,6 +795,7 @@ def update_notepadplusplus():
|
|||
# Cleanup
|
||||
remove_from_temp('npp.7z')
|
||||
|
||||
|
||||
def update_putty():
|
||||
# Stop running processes
|
||||
kill_process('PUTTY.EXE')
|
||||
|
|
@ -801,6 +812,7 @@ def update_putty():
|
|||
# Cleanup
|
||||
remove_from_temp('putty.zip')
|
||||
|
||||
|
||||
def update_wiztree():
|
||||
# Stop running processes
|
||||
for process in ['WizTree.exe', 'WizTree64.exe']:
|
||||
|
|
@ -819,6 +831,7 @@ def update_wiztree():
|
|||
# Cleanup
|
||||
remove_from_temp('wiztree.zip')
|
||||
|
||||
|
||||
def update_xmplay():
|
||||
# Stop running processes
|
||||
kill_process('xmplay.exe')
|
||||
|
|
@ -874,7 +887,8 @@ def update_xmplay():
|
|||
remove_from_temp('xmp-rar.zip')
|
||||
remove_from_temp('WAModern.zip')
|
||||
|
||||
## Repairs ##
|
||||
|
||||
# Repairs
|
||||
def update_adwcleaner():
|
||||
# Stop running processes
|
||||
kill_process('AdwCleaner.exe')
|
||||
|
|
@ -888,6 +902,7 @@ def update_adwcleaner():
|
|||
'AdwCleaner.exe',
|
||||
SOURCE_URLS['AdwCleaner'])
|
||||
|
||||
|
||||
def update_kvrt():
|
||||
# Stop running processes
|
||||
kill_process('KVRT.exe')
|
||||
|
|
@ -901,6 +916,7 @@ def update_kvrt():
|
|||
'KVRT.exe',
|
||||
SOURCE_URLS['KVRT'])
|
||||
|
||||
|
||||
def update_rkill():
|
||||
# Stop running processes
|
||||
kill_process('RKill.exe')
|
||||
|
|
@ -915,6 +931,7 @@ def update_rkill():
|
|||
download_generic(
|
||||
r'{}\RKill'.format(global_vars['CBinDir']), 'RKill.exe', url)
|
||||
|
||||
|
||||
def update_tdsskiller():
|
||||
# Stop running processes
|
||||
kill_process('TDSSKiller.exe')
|
||||
|
|
@ -928,7 +945,8 @@ def update_tdsskiller():
|
|||
'TDSSKiller.exe',
|
||||
SOURCE_URLS['TDSSKiller'])
|
||||
|
||||
## Uninstallers ##
|
||||
|
||||
# Uninstallers
|
||||
def update_iobit_uninstaller():
|
||||
# Stop running processes
|
||||
kill_process('IObitUninstallerPortable.exe')
|
||||
|
|
@ -951,5 +969,8 @@ def update_iobit_uninstaller():
|
|||
# Cleanup
|
||||
remove_from_kit('IObitUninstallerPortable.exe')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
from functions.data import *
|
||||
from functions.disk import *
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
WINDOWS_VERSIONS = [
|
||||
{'Name': 'Windows 7 Home Basic',
|
||||
|
|
@ -35,6 +36,7 @@ WINDOWS_VERSIONS = [
|
|||
'Image Name': 'Windows 10 Pro'},
|
||||
]
|
||||
|
||||
|
||||
def find_windows_image(windows_version):
|
||||
"""Search for a Windows source image file, returns dict.
|
||||
|
||||
|
|
@ -85,6 +87,7 @@ def find_windows_image(windows_version):
|
|||
windows_version['Name']))
|
||||
raise GenericAbort
|
||||
|
||||
|
||||
def format_disk(disk, use_gpt):
|
||||
"""Format disk for use as a Windows OS disk."""
|
||||
if use_gpt:
|
||||
|
|
@ -92,6 +95,7 @@ def format_disk(disk, use_gpt):
|
|||
else:
|
||||
format_mbr(disk)
|
||||
|
||||
|
||||
def format_gpt(disk):
|
||||
"""Format disk for use as a Windows OS disk using the GPT layout."""
|
||||
script = [
|
||||
|
|
@ -126,6 +130,7 @@ def format_gpt(disk):
|
|||
# Run
|
||||
run_diskpart(script)
|
||||
|
||||
|
||||
def format_mbr(disk):
|
||||
"""Format disk for use as a Windows OS disk using the MBR layout."""
|
||||
script = [
|
||||
|
|
@ -155,14 +160,16 @@ def format_mbr(disk):
|
|||
# Run
|
||||
run_diskpart(script)
|
||||
|
||||
|
||||
def mount_windows_share():
|
||||
"""Mount the Windows images share unless labeled as already mounted."""
|
||||
"""Mount the Windows images share unless already mounted."""
|
||||
if not WINDOWS_SERVER['Mounted']:
|
||||
# Mounting read-write in case a backup was done in the same session
|
||||
# and the server was left mounted read-write. This avoids throwing an
|
||||
# error by trying to mount the same server with multiple credentials.
|
||||
mount_network_share(WINDOWS_SERVER, read_write=True)
|
||||
|
||||
|
||||
def select_windows_version():
|
||||
"""Select Windows version from a menu, returns dict."""
|
||||
actions = [
|
||||
|
|
@ -180,6 +187,7 @@ def select_windows_version():
|
|||
elif selection == 'M':
|
||||
raise GenericAbort
|
||||
|
||||
|
||||
def setup_windows(windows_image, windows_version):
|
||||
"""Apply a Windows image to W:"""
|
||||
cmd = [
|
||||
|
|
@ -192,6 +200,7 @@ def setup_windows(windows_image, windows_version):
|
|||
cmd.extend(windows_image['Glob'])
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def setup_windows_re(windows_version, windows_letter='W', tools_letter='T'):
|
||||
"""Setup the WinRE partition."""
|
||||
win = r'{}:\Windows'.format(windows_letter)
|
||||
|
|
@ -210,6 +219,7 @@ def setup_windows_re(windows_version, windows_letter='W', tools_letter='T'):
|
|||
'/target', win]
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def update_boot_partition(system_letter='S', windows_letter='W', mode='ALL'):
|
||||
"""Setup the Windows boot partition."""
|
||||
cmd = [
|
||||
|
|
@ -220,6 +230,7 @@ def update_boot_partition(system_letter='S', windows_letter='W', mode='ALL'):
|
|||
'/f', mode]
|
||||
run_program(cmd)
|
||||
|
||||
|
||||
def wim_contains_image(filename, imagename):
|
||||
"""Check if an ESD/WIM contains the specified image, returns bool."""
|
||||
cmd = [
|
||||
|
|
@ -234,5 +245,8 @@ def wim_contains_image(filename, imagename):
|
|||
|
||||
return True
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ from functions.backup import *
|
|||
from functions.disk import *
|
||||
from functions.windows_setup import *
|
||||
|
||||
|
||||
# STATIC VARIABLES
|
||||
FAST_COPY_PE_ARGS = [
|
||||
'/cmd=noexist_only',
|
||||
|
|
@ -50,6 +51,7 @@ PE_TOOLS = {
|
|||
},
|
||||
}
|
||||
|
||||
|
||||
def check_pe_tools():
|
||||
"""Fix tool paths for WinPE layout."""
|
||||
for k in PE_TOOLS.keys():
|
||||
|
|
@ -61,6 +63,7 @@ def check_pe_tools():
|
|||
global_vars['Tools']['wimlib-imagex'],
|
||||
re.IGNORECASE)
|
||||
|
||||
|
||||
def menu_backup():
|
||||
"""Take backup images of partition(s) in the WIM format."""
|
||||
errors = False
|
||||
|
|
@ -211,6 +214,7 @@ def menu_backup():
|
|||
sleep(30)
|
||||
pause('\nPress Enter to return to main menu... ')
|
||||
|
||||
|
||||
def menu_root():
|
||||
"""Main WinPE menu."""
|
||||
check_pe_tools()
|
||||
|
|
@ -249,8 +253,9 @@ def menu_root():
|
|||
else:
|
||||
sys.exit()
|
||||
|
||||
|
||||
def menu_setup():
|
||||
"""Format a disk (MBR/GPT), apply a Windows image, and setup boot files."""
|
||||
"""Format a disk, apply a Windows image, and create boot files."""
|
||||
errors = False
|
||||
other_results = {
|
||||
'Error': {
|
||||
|
|
@ -409,6 +414,7 @@ def menu_setup():
|
|||
sleep(30)
|
||||
pause('\nPress Enter to return to main menu... ')
|
||||
|
||||
|
||||
def menu_tools():
|
||||
"""Tool launcher menu."""
|
||||
tools = [{'Name': k} for k in sorted(PE_TOOLS.keys())]
|
||||
|
|
@ -438,6 +444,7 @@ def menu_tools():
|
|||
elif (selection == 'M'):
|
||||
break
|
||||
|
||||
|
||||
def select_minidump_path():
|
||||
"""Select BSOD minidump path from a menu."""
|
||||
dumps = []
|
||||
|
|
@ -467,5 +474,8 @@ def select_minidump_path():
|
|||
main_entries = dumps)
|
||||
return dumps[int(selection) - 1]['Name']
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -6,8 +6,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.common import *
|
||||
init_global_vars()
|
||||
|
||||
|
|
@ -40,3 +39,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -1,18 +0,0 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
## Wizard Kit: HW Diagnostics - badblocks
|
||||
|
||||
function usage {
|
||||
echo "Usage: $0 device log-file"
|
||||
echo " e.g. $0 /dev/sda /tmp/tmp.XXXXXXX/badblocks.log"
|
||||
}
|
||||
|
||||
# Bail early
|
||||
if [ ! -b "$1" ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run Badblocks
|
||||
sudo badblocks -sv -e 1 "$1" 2>&1 | tee -a "$2"
|
||||
|
||||
|
|
@ -6,25 +6,31 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.hw_diags import *
|
||||
from functions.tmux 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()
|
||||
try:
|
||||
state = State()
|
||||
menu_diags(state, sys.argv)
|
||||
except KeyboardInterrupt:
|
||||
print_standard(' ')
|
||||
print_warning('Aborted')
|
||||
print_standard(' ')
|
||||
sleep(1)
|
||||
pause('Press Enter to exit...')
|
||||
except SystemExit:
|
||||
# Normal exit
|
||||
pass
|
||||
except:
|
||||
tmux_kill_all_panes()
|
||||
major_exception()
|
||||
|
||||
# Done
|
||||
tmux_kill_all_panes()
|
||||
exit_script()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -6,15 +6,16 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
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
|
||||
|
|
@ -44,3 +45,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -14,5 +14,6 @@ if [ ! -d "$1" ]; then
|
|||
fi
|
||||
|
||||
# Run Prime95
|
||||
mprime -t | grep -iv --line-buffered 'stress.txt' | tee -a "$1/prime.log"
|
||||
cd "$1"
|
||||
mprime -t | grep -iv --line-buffered 'stress.txt' | tee -a "prime.log"
|
||||
|
||||
|
|
|
|||
|
|
@ -105,8 +105,3 @@ echo -e "${BLUE}Drives${CLEAR}"
|
|||
hw-drive-info | sed 's/^/ /'
|
||||
echo ""
|
||||
|
||||
# Sensors
|
||||
echo -e "${BLUE}Sensors${CLEAR}"
|
||||
hw-sensors | sed 's/^/ /'
|
||||
echo ""
|
||||
|
||||
|
|
|
|||
|
|
@ -1,168 +1,10 @@
|
|||
#!/bin/python3
|
||||
#!/bin/bash
|
||||
#
|
||||
## Wizard Kit: Sensor monitoring tool
|
||||
|
||||
import itertools
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
WINDOW_NAME="Hardware Sensors"
|
||||
MONITOR="hw-sensors-monitor"
|
||||
|
||||
# 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.TEMP:
|
||||
# Skip non-temperature sensors
|
||||
return None
|
||||
|
||||
for sf in sfs:
|
||||
name = sf.name[skipname:].decode("utf-8").strip()
|
||||
try:
|
||||
val = sensors.get_value(chip, sf.number)
|
||||
except Exception:
|
||||
# Ignore upstream sensor bugs and lie instead
|
||||
val = -123456789
|
||||
if 'alarm' in name:
|
||||
# Skip
|
||||
continue
|
||||
if '--nocolor' in sys.argv:
|
||||
try:
|
||||
temp = float(val)
|
||||
except ValueError:
|
||||
data[name] = ' {}°C'.format(val)
|
||||
else:
|
||||
data[name] = '{}{:2.0f}°C'.format(
|
||||
'-' if temp < 0 else '',
|
||||
temp)
|
||||
else:
|
||||
data[name] = color_temp(val)
|
||||
|
||||
main_temp = data.pop('input', None)
|
||||
if main_temp:
|
||||
list_data = []
|
||||
for item in ['max', 'crit']:
|
||||
if item in data:
|
||||
list_data.append('{}: {}'.format(item, data.pop(item)))
|
||||
list_data.extend(
|
||||
['{}: {}'.format(k, v) for k, v in sorted(data.items())])
|
||||
data_str = '{:18} {} {}'.format(
|
||||
label, main_temp, ', '.join(list_data))
|
||||
else:
|
||||
list_data.extend(sorted(data.items()))
|
||||
list_data = ['{}: {}'.format(item[0], item[1]) for item in list_data]
|
||||
data_str = '{:18} {}'.format(label, ', '.join(list_data))
|
||||
return data_str
|
||||
|
||||
def join_columns(column1, column2, width=55):
|
||||
return '{:<{}}{}'.format(
|
||||
column1,
|
||||
55+len(column1)-len(REGEX_COLORS.sub('', column1)),
|
||||
column2)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
# Prep
|
||||
sensors.init()
|
||||
|
||||
# Get sensor data
|
||||
chip_temps = {}
|
||||
for chip in sensors.ChipIterator():
|
||||
chip_name = '{} ({})'.format(
|
||||
sensors.chip_snprintf_name(chip),
|
||||
sensors.get_adapter_name(chip.bus))
|
||||
chip_feats = [get_feature_string(chip, feature)
|
||||
for feature in sensors.FeatureIterator(chip)]
|
||||
# Strip empty/None items
|
||||
chip_feats = [f for f in chip_feats if f]
|
||||
|
||||
if chip_feats:
|
||||
chip_temps[chip_name] = [chip_name, *chip_feats, '']
|
||||
|
||||
# Sort chips
|
||||
sensor_temps = []
|
||||
for chip in [k for k in sorted(chip_temps.keys()) if 'coretemp' in k]:
|
||||
sensor_temps.extend(chip_temps[chip])
|
||||
for chip in sorted(chip_temps.keys()):
|
||||
if 'coretemp' not in chip:
|
||||
sensor_temps.extend(chip_temps[chip])
|
||||
|
||||
# Wrap columns as needed
|
||||
screen_size = shutil.get_terminal_size()
|
||||
rows = screen_size.lines - 1
|
||||
if len(sensor_temps) > rows and screen_size.columns > 55*2:
|
||||
sensor_temps = list(itertools.zip_longest(
|
||||
sensor_temps[:rows], sensor_temps[rows:], fillvalue=''))
|
||||
sensor_temps = [join_columns(a, b) for a, b in sensor_temps]
|
||||
|
||||
# Print data
|
||||
if sensor_temps:
|
||||
for line in sensor_temps:
|
||||
print_standard(line)
|
||||
else:
|
||||
if '--nocolor' in sys.argv:
|
||||
print_standard('WARNING: No sensors found')
|
||||
print_standard('\nPlease monitor temps manually')
|
||||
else:
|
||||
print_warning('WARNING: No sensors found')
|
||||
print_standard('\nPlease monitor temps manually')
|
||||
|
||||
# Done
|
||||
sensors.cleanup()
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
sensors.cleanup()
|
||||
pass
|
||||
except:
|
||||
sensors.cleanup()
|
||||
major_exception()
|
||||
# Start session
|
||||
tmux new-session -n "$WINDOW_NAME" "$MONITOR"
|
||||
|
||||
|
|
|
|||
36
.bin/Scripts/hw-sensors-monitor
Executable file
36
.bin/Scripts/hw-sensors-monitor
Executable file
|
|
@ -0,0 +1,36 @@
|
|||
#!/bin/python3
|
||||
#
|
||||
## Wizard Kit: Sensor monitoring tool
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.sensors import *
|
||||
from functions.tmux import *
|
||||
init_global_vars(silent=True)
|
||||
|
||||
if __name__ == '__main__':
|
||||
background = False
|
||||
try:
|
||||
if len(sys.argv) > 1 and os.path.exists(sys.argv[1]):
|
||||
background = True
|
||||
monitor_file = sys.argv[1]
|
||||
monitor_pane = None
|
||||
else:
|
||||
result = run_program(['mktemp'])
|
||||
monitor_file = result.stdout.decode().strip()
|
||||
if not background:
|
||||
monitor_pane = tmux_split_window(
|
||||
percent=1, vertical=True, watch=monitor_file)
|
||||
cmd = ['tmux', 'resize-pane', '-Z', '-t', monitor_pane]
|
||||
run_program(cmd, check=False)
|
||||
monitor_sensors(monitor_pane, monitor_file)
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SW Bundle Tool'.format(KIT_NAME_FULL))
|
||||
|
|
@ -42,11 +41,13 @@ if __name__ == '__main__':
|
|||
if answer_vcr:
|
||||
install_vcredists()
|
||||
if answer_ninite:
|
||||
try_and_print(message='Ninite bundle...',
|
||||
result = try_and_print(message='Ninite bundle...',
|
||||
function=install_ninite_bundle, cs='Started',
|
||||
mse=answer_mse, other_results=other_results)
|
||||
for proc in result['Out']:
|
||||
# Wait for all processes to finish
|
||||
proc.wait()
|
||||
if answer_extensions:
|
||||
wait_for_process('ninite.exe')
|
||||
print_info('Installing Extensions')
|
||||
try_and_print(message='Classic Shell skin...',
|
||||
function=install_classicstart_skin,
|
||||
|
|
@ -63,4 +64,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=4 sw=4 ts=4
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Install Visual C++ Runtimes'.format(KIT_NAME_FULL))
|
||||
|
|
@ -32,3 +31,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -6,8 +6,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.data import *
|
||||
init_global_vars()
|
||||
|
||||
|
|
@ -36,3 +35,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -6,8 +6,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.data import *
|
||||
from functions.network import *
|
||||
init_global_vars()
|
||||
|
|
@ -36,3 +35,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -15,20 +15,21 @@ USAGE = '''Usage: {script} <search-terms>...
|
|||
the search-terms provided (case-insensitive).'''.format(script=__file__)
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
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)
|
||||
yield from scan_for_docs(entry.path)
|
||||
elif entry.is_file and REGEX_DOC_FILES.search(entry.name):
|
||||
yield entry
|
||||
|
||||
|
||||
def scan_file(file_path, search):
|
||||
match = False
|
||||
try:
|
||||
|
|
@ -45,6 +46,7 @@ def scan_file(file_path, search):
|
|||
|
||||
return entry.path if match else None
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
# Prep
|
||||
|
|
@ -79,3 +81,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
157
.bin/Scripts/new_system_setup.py
Normal file
157
.bin/Scripts/new_system_setup.py
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
# Wizard Kit: New system setup
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.activation import *
|
||||
from functions.browsers import *
|
||||
from functions.cleanup import *
|
||||
from functions.info import *
|
||||
from functions.product_keys import *
|
||||
from functions.setup import *
|
||||
from functions.sw_diags import *
|
||||
init_global_vars()
|
||||
os.system('title {}: New System Setup'.format(KIT_NAME_FULL))
|
||||
set_log_file('New System Setup.log')
|
||||
|
||||
if __name__ == '__main__':
|
||||
other_results = {
|
||||
'Error': {
|
||||
'BIOSKeyNotFoundError': 'BIOS key not found',
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
'FileNotFoundError': 'File not found',
|
||||
'GenericError': 'Unknown Error',
|
||||
'SecureBootDisabledError': 'Disabled',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'NoProfilesError': 'No profiles found',
|
||||
'NotInstalledError': 'Not installed',
|
||||
'OSInstalledLegacyError': 'OS installed Legacy',
|
||||
'SecureBootNotAvailError': 'Not available',
|
||||
'SecureBootUnknownError': 'Unknown',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
|
||||
# Check installed OS
|
||||
if os_is_unsupported(show_alert=False):
|
||||
print_warning('OS version not supported by this script')
|
||||
if not ask('Continue anyway? (NOT RECOMMENDED)'):
|
||||
abort()
|
||||
|
||||
# Install Adobe Reader?
|
||||
answer_adobe_reader = ask('Install Adobe Reader?')
|
||||
|
||||
# Install LibreOffice?
|
||||
answer_libreoffice = ask('Install LibreOffice?')
|
||||
|
||||
# Install MSE?
|
||||
if global_vars['OS']['Version'] == '7':
|
||||
answer_mse = ask('Install MSE?')
|
||||
else:
|
||||
answer_mse = False
|
||||
|
||||
# Install software
|
||||
print_info('Installing Programs')
|
||||
install_vcredists()
|
||||
if answer_adobe_reader:
|
||||
try_and_print(message='Adobe Reader DC...',
|
||||
function=install_adobe_reader, other_results=other_results)
|
||||
result = try_and_print(
|
||||
message='Ninite bundle...',
|
||||
function=install_ninite_bundle, cs='Started',
|
||||
mse=answer_mse, libreoffice=answer_libreoffice,
|
||||
other_results=other_results)
|
||||
for proc in result['Out']:
|
||||
# Wait for all processes to finish
|
||||
proc.wait()
|
||||
|
||||
# Scan for supported browsers
|
||||
print_info('Scanning for browsers')
|
||||
scan_for_browsers()
|
||||
|
||||
# Install extensions
|
||||
print_info('Installing Extensions')
|
||||
try_and_print(message='Classic Shell skin...',
|
||||
function=install_classicstart_skin,
|
||||
other_results=other_results)
|
||||
try_and_print(message='Google Chrome extensions...',
|
||||
function=install_chrome_extensions)
|
||||
try_and_print(message='Mozilla Firefox extensions...',
|
||||
function=install_firefox_extensions,
|
||||
other_results=other_results)
|
||||
|
||||
# Configure software
|
||||
print_info('Configuring programs')
|
||||
install_adblock()
|
||||
if global_vars['OS']['Version'] == '10':
|
||||
try_and_print(message='ClassicStart...',
|
||||
function=config_classicstart, cs='Done')
|
||||
try_and_print(message='Explorer...',
|
||||
function=config_explorer_user, cs='Done')
|
||||
|
||||
# Configure system
|
||||
print_info('Configuring system')
|
||||
if global_vars['OS']['Version'] == '10':
|
||||
try_and_print(message='Explorer...',
|
||||
function=config_explorer_system, cs='Done')
|
||||
try_and_print(message='Disabling telemetry...',
|
||||
function=disable_windows_telemetry, cs='Done')
|
||||
try_and_print(message='Updating Clock...',
|
||||
function=update_clock, cs='Done')
|
||||
|
||||
# Summary
|
||||
print_info('Summary')
|
||||
try_and_print(message='Operating System:',
|
||||
function=show_os_name, ns='Unknown', silent_function=False)
|
||||
try_and_print(message='Activation:',
|
||||
function=show_os_activation, ns='Unknown', silent_function=False)
|
||||
if (not windows_is_activated()
|
||||
and global_vars['OS']['Version'] in ('8', '8.1', '10')):
|
||||
try_and_print(message='BIOS Activation:',
|
||||
function=activate_with_bios,
|
||||
other_results=other_results)
|
||||
try_and_print(message='Secure Boot Status:',
|
||||
function=check_secure_boot_status, other_results=other_results)
|
||||
try_and_print(message='Installed RAM:',
|
||||
function=show_installed_ram, ns='Unknown', silent_function=False)
|
||||
show_free_space()
|
||||
try_and_print(message='Installed Antivirus:',
|
||||
function=get_installed_antivirus, ns='Unknown',
|
||||
other_results=other_results, print_return=True)
|
||||
|
||||
# Play audio, show devices, open Windows updates, and open Activation
|
||||
try_and_print(message='Opening Device Manager...',
|
||||
function=open_device_manager, cs='Started')
|
||||
try_and_print(message='Opening HWiNFO (Sensors)...',
|
||||
function=run_hwinfo_sensors, cs='Started', other_results=other_results)
|
||||
try_and_print(message='Opening Windows Updates...',
|
||||
function=open_windows_updates, cs='Started')
|
||||
if not windows_is_activated():
|
||||
try_and_print(message='Opening Windows Activation...',
|
||||
function=open_windows_activation, cs='Started')
|
||||
sleep(3)
|
||||
try_and_print(message='Running XMPlay...',
|
||||
function=run_xmplay, cs='Started', other_results=other_results)
|
||||
try:
|
||||
check_secure_boot_status(show_alert=True)
|
||||
except:
|
||||
# Only trying to open alert message boxes
|
||||
pass
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause('Press Enter to exit...')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.safemode import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
|
||||
|
|
@ -36,3 +35,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.safemode import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
|
||||
|
|
@ -36,3 +35,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -212,6 +212,7 @@ LAUNCHERS = {
|
|||
r')',
|
||||
],
|
||||
},
|
||||
},
|
||||
r'Diagnostics\Extras': {
|
||||
'AIDA64': {
|
||||
'L_TYPE': 'Executable',
|
||||
|
|
@ -281,8 +282,8 @@ LAUNCHERS = {
|
|||
'Intel RST (Current Release)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': '_Drivers\Intel RST',
|
||||
'L_ITEM': 'SetupRST_16.5.exe',
|
||||
'L_7ZIP': 'SetupRST_16.5.exe',
|
||||
'L_ITEM': 'SetupRST_16.8.exe',
|
||||
'L_7ZIP': 'SetupRST_16.8.exe',
|
||||
},
|
||||
'Intel RST (Previous Releases)': {
|
||||
'L_TYPE': 'Folder',
|
||||
|
|
@ -356,39 +357,65 @@ LAUNCHERS = {
|
|||
},
|
||||
},
|
||||
r'Installers\Extras\Office\2016': {
|
||||
'Home and Business 2016 (x32)': {
|
||||
'Home and Business (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hb_32.xml',
|
||||
'L_ITEM': '2016_hb_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Business 2016 (x64)': {
|
||||
'Home and Business (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hb_64.xml',
|
||||
'L_ITEM': '2016_hb_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student 2016 (x32)': {
|
||||
'Home and Student (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hs_32.xml',
|
||||
'L_ITEM': '2016_hs_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student 2016 (x64)': {
|
||||
'Home and Student (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hs_64.xml',
|
||||
'L_ITEM': '2016_hs_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Office 365 2016 (x32)': {
|
||||
},
|
||||
r'Installers\Extras\Office\2019': {
|
||||
'Home and Business (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_PATH': '2019',
|
||||
'L_ITEM': '2019_hb_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Business (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2019',
|
||||
'L_ITEM': '2019_hb_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2019',
|
||||
'L_ITEM': '2019_hs_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2019',
|
||||
'L_ITEM': '2019_hs_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Office 365 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2019',
|
||||
'L_ITEM': '365_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Office 365 2016 (x64)': {
|
||||
'Office 365 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_PATH': '2019',
|
||||
'L_ITEM': '365_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
|
|
@ -556,8 +583,9 @@ LAUNCHERS = {
|
|||
'L_ITEM': 'IObitUninstallerPortable.exe',
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
ENABLED_OPEN_LOGS = False
|
||||
ENABLED_TICKET_NUMBERS = False
|
||||
ENABLED_UPLOAD_DATA = False
|
||||
HW_OVERRIDES_FORCED = False
|
||||
HW_OVERRIDES_LIMITED = True # If True this disables HW_OVERRIDE_FORCED
|
||||
|
||||
# STATIC VARIABLES (also used by BASH and BATCH files)
|
||||
## NOTE: There are no spaces around the = for easier parsing in BASH and BATCH
|
||||
|
|
@ -89,3 +91,5 @@ WINDOWS_SERVER = {
|
|||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -68,3 +68,5 @@ MUSIC_SNES = [
|
|||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
325
.bin/Scripts/settings/partition_uids.py
Normal file
325
.bin/Scripts/settings/partition_uids.py
Normal file
|
|
@ -0,0 +1,325 @@
|
|||
# Wizard Kit: Settings - Partition UIDs
|
||||
# sources: https://en.wikipedia.org/wiki/GUID_Partition_Table
|
||||
# https://en.wikipedia.org/wiki/Partition_type
|
||||
# NOTE: Info has been trimmed for brevity. As such, there may be some inaccuracy.
|
||||
|
||||
PARTITION_UIDS = {
|
||||
'00': {'OS': 'All','Description': 'Empty partition entry'},
|
||||
'01': {'OS': 'DOS','Description': 'FAT12 as primary partition'},
|
||||
'02': {'OS': 'XENIX','Description': 'XENIX root'},
|
||||
'03': {'OS': 'XENIX','Description': 'XENIX usr'},
|
||||
'04': {'OS': 'DOS','Description': 'FAT16 with less than 32 MB'},
|
||||
'05': {'OS': 'DOS / SpeedStor','Description': 'Extended partition'},
|
||||
'06': {'OS': 'DOS1+','Description': 'FAT16B [over 65K sectors]'},
|
||||
'07': {'OS': 'Windows / OS/2 / QNX 2','Description': 'NTFS/exFAT/HPFS/IFS/QNX'},
|
||||
'08': {'OS': 'CBM / DOS / OS/2 / AIX /QNX','Description': 'FAT12-16/AIX/QNY/SplitDrive'},
|
||||
'09': {'OS': 'AIX / QNX / Coherent / OS-9','Description': 'AIX/QNZ/Coherent/RBF'},
|
||||
'0A': {'OS': 'OS/2 / Coherent','Description': 'Boot Manager / Swap'},
|
||||
'0B': {'OS': 'DOS','Description': 'FAT32 with CHS addressing'},
|
||||
'0C': {'OS': 'DOS','Description': 'FAT32 with LBA'},
|
||||
'0D': {'OS': 'Silicon Safe','Description': 'Reserved'},
|
||||
'0E': {'OS': 'DOS','Description': 'FAT16B with LBA'},
|
||||
'0F': {'OS': 'DOS','Description': 'Extended partition with LBA'},
|
||||
'10': {'OS': 'OPUS','Description': 'Unknown'},
|
||||
'11': {'OS': 'Leading Edge MS-DOS / OS/2','Description': 'FAT12/FAT16'},
|
||||
'12': {'OS': 'Compaq Contura','Description': 'conf/diag/hiber/rescue/serv'},
|
||||
'14': {'OS': 'AST DOS / OS/2 / MaverickOS','Description': 'FAT12/FAT16/Omega'},
|
||||
'15': {'OS': 'OS/2 / Maverick OS','Description': 'Hidden extended / Swap'},
|
||||
'16': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16B'},
|
||||
'17': {'OS': 'OS/2 Boot Manager','Description': 'Hidden IFS/HPFS/NTFS/exFAT'},
|
||||
'18': {'OS': 'AST Windows','Description': '0-Volt Suspend/SmartSleep'},
|
||||
'19': {'OS': 'Willowtech Photon coS','Description': 'Willowtech Photon coS'},
|
||||
'1B': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32'},
|
||||
'1C': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32 with LBA'},
|
||||
'1E': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16 with LBA'},
|
||||
'1F': {'OS': 'OS/2 Boot Manager','Description': 'Hidden extended with LBA'},
|
||||
'20': {'OS': 'Windows Mobile','Description': 'update XIP/Willowsoft OFS1'},
|
||||
'21': {'OS': 'Oxygen','Description': 'SpeedStor / FSo2'},
|
||||
'22': {'OS': 'Oxygen','Description': 'Oxygen Extended Partition'},
|
||||
'23': {'OS': 'Windows Mobile','Description': 'Reserved / boot XIP'},
|
||||
'24': {'OS': 'NEC MS-DOS0','Description': 'Logical FAT12 or FAT16'},
|
||||
'25': {'OS': 'Windows Mobile','Description': 'IMGFS[citation needed]'},
|
||||
'26': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'27': {'OS': 'Win/PQserv/MirOS/RooterBOOT','Description': 'WinRE/Rescue/MirOS/RooterBOOT'},
|
||||
'2A': {'OS': 'AtheOS','Description': 'AthFS/AFS/Reserved'},
|
||||
'2B': {'OS': 'SyllableOS','Description': 'SyllableSecure (SylStor)'},
|
||||
'31': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'32': {'OS': 'NOS','Description': 'Unknown'},
|
||||
'33': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'34': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'35': {'OS': 'OS/2 Server /eComStation','Description': 'JFS'},
|
||||
'36': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'38': {'OS': 'THEOS','Description': 'THEOS version 3.2, 2 GB'},
|
||||
'39': {'OS': 'Plan 9 / THEOS','Description': 'Plan 9 edition 3 / THEOS v4'},
|
||||
'3A': {'OS': 'THEOS','Description': 'THEOS v4, 4 GB'},
|
||||
'3B': {'OS': 'THEOS','Description': 'THEOS v4 extended'},
|
||||
'3C': {'OS': 'PartitionMagic','Description': 'PqRP (image in progress)'},
|
||||
'3D': {'OS': 'PartitionMagic','Description': 'Hidden NetWare'},
|
||||
'3F': {'OS': 'OS/32','Description': 'Unknown'},
|
||||
'40': {'OS': 'PICK / Venix','Description': 'PICK R83 / Venix 80286'},
|
||||
'41': {'OS': 'RISC / Linux / PowerPC','Description': 'Boot / Old Linux/Minix'},
|
||||
'42': {'OS': 'SFS / Linux / Win2K/XP/etc','Description': 'SFS / Old Linux Swap'},
|
||||
'43': {'OS': 'Linux','Description': 'Old Linux native'},
|
||||
'44': {'OS': 'GoBack','Description': 'Norton/WildFire/Adaptec/Roxio'},
|
||||
'45': {'OS': 'Boot-US / EUMEL/ELAN','Description': 'Priam/Boot/EUMEL/ELAN (L2)'},
|
||||
'46': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'},
|
||||
'47': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'},
|
||||
'48': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2), ERGOS L3'},
|
||||
'4A': {'OS': 'AdaOS / ALFS/THIN','Description': 'Aquila / ALFS/THIN'},
|
||||
'4C': {'OS': 'ETH Oberon','Description': 'Aos (A2) file system (76)'},
|
||||
'4D': {'OS': 'QNX Neutrino','Description': 'Primary QNX POSIX volume'},
|
||||
'4E': {'OS': 'QNX Neutrino','Description': 'Secondary QNX POSIX volume'},
|
||||
'4F': {'OS': 'QNX Neutrino / ETH Oberon','Description': '3rd QNX POSIX/Boot/Native'},
|
||||
'50': {'OS': 'DiskMan4/ETH/LynxOS/Novell','Description': 'Alt FS/Read-only/Lynx RTOS'},
|
||||
'51': {'OS': 'Disk Manager 4-6','Description': 'R/W partition (Aux 1)'},
|
||||
'52': {'OS': 'CP/M-80/ System V/AT, V/386','Description': 'CP/M-80'},
|
||||
'53': {'OS': 'Disk Manager 6','Description': 'Auxiliary 3 (WO)'},
|
||||
'54': {'OS': 'Disk Manager 6','Description': 'Dynamic Drive Overlay (DDO)'},
|
||||
'55': {'OS': 'EZ-Drive','Description': 'Maxtor/MaxBlast/DriveGuide'},
|
||||
'56': {'OS': 'AT&T DOS/EZ-Drive/VFeature','Description': 'FAT12 16/EZ-BIOS/VFeature'},
|
||||
'57': {'OS': 'DrivePro','Description': 'VNDI partition'},
|
||||
'5C': {'OS': 'EDISK','Description': 'Priam EDisk Volume'},
|
||||
'61': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'63': {'OS': 'Unix','Description': 'Unix,ISC,SysV,ix,BSD,HURD'},
|
||||
'64': {'OS': 'SpeedStor / NetWare','Description': 'NetWare FS 286/2,PC-ARMOUR'},
|
||||
'65': {'OS': 'NetWare','Description': 'NetWare File System 386'},
|
||||
'66': {'OS': 'NetWare / NetWare','Description': 'NetWare FS 386 / SMS'},
|
||||
'67': {'OS': 'NetWare','Description': 'Wolf Mountain'},
|
||||
'68': {'OS': 'NetWare','Description': 'Unknown'},
|
||||
'69': {'OS': 'NetWare 5 / NetWare','Description': 'Novell Storage Services'},
|
||||
'6E': {'Description': 'Unknown'},
|
||||
'70': {'OS': 'DiskSecure','Description': 'DiskSecure multiboot'},
|
||||
'71': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'72': {'OS': 'APTI systems / Unix V7/x86','Description': 'APTI altFAT12 / V7 / x86'},
|
||||
'73': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'74': {'OS': 'Microsoft, IBM','Description': 'Reserved / Scramdisk'},
|
||||
'75': {'OS': 'PC/IX','Description': 'Unknown'},
|
||||
'76': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'77': {'OS': 'Novell','Description': 'VNDI, M2FS, M2CS'},
|
||||
'78': {'OS': 'Geurt Vos','Description': 'XOSL bootloader file system'},
|
||||
'79': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (CHS, SFN)'},
|
||||
'7A': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (LBA, SFN)'},
|
||||
'7B': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16B (CHS, SFN)'},
|
||||
'7C': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (LBA, SFN)'},
|
||||
'7D': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (CHS, SFN)'},
|
||||
'7E': {'OS': 'F.I.X. (claim) / PrimoCache','Description': 'Level 2 cache'},
|
||||
'7F': {'OS': 'Varies','Description': 'AltOS DevPartition Standard'},
|
||||
'80': {'OS': 'Minix 1.1-1.4a','Description': 'Minix file system (old)'},
|
||||
'81': {'OS': 'Minix 1.4b+ / Linux','Description': 'MINIX FS/Mitac AdvDiskManager'},
|
||||
'82': {'OS': 'Linux / Sun Microsystems','Description': 'Swap / Solaris x86 / Prime'},
|
||||
'83': {'OS': 'GNU/Linux','Description': 'Any native Linux FS'},
|
||||
'84': {'OS': 'OS/2 / Windows 7','Description': 'Hibernat/HiddenC/RapidStart'},
|
||||
'85': {'OS': 'GNU/Linux','Description': 'Linux extended'},
|
||||
'86': {'OS': 'Windows NT 4 Server / Linux','Description': 'FAT16B mirror/LinuxRAID-old'},
|
||||
'87': {'OS': 'Windows NT 4 Server','Description': 'HPFS/NTFS mirrored volume'},
|
||||
'88': {'OS': 'GNU/Linux','Description': 'Plaintext partition table'},
|
||||
'8A': {'OS': 'AiR-BOOT','Description': 'Linux kernel image'},
|
||||
'8B': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'},
|
||||
'8C': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'},
|
||||
'8D': {'OS': 'Free FDISK','Description': 'Hidden FAT12'},
|
||||
'8E': {'OS': 'Linux','Description': 'Linux LVM'},
|
||||
'90': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
||||
'91': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
||||
'92': {'OS': 'Free FDISK','Description': 'Hidden FAT16B'},
|
||||
'93': {'OS': 'Amoeba / Linux','Description': 'Amoeba native/Hidden Linux'},
|
||||
'94': {'OS': 'Amoeba','Description': 'Amoeba bad block table'},
|
||||
'95': {'OS': 'EXOPC','Description': 'EXOPC native'},
|
||||
'96': {'OS': 'CHRP','Description': 'ISO-9660 file system'},
|
||||
'97': {'OS': 'Free FDISK','Description': 'Hidden FAT32'},
|
||||
'98': {'OS': 'Free FDISK / ROM-DOS','Description': 'Hidden FAT32 / service part'},
|
||||
'99': {'OS': 'early Unix','Description': 'Unknown'},
|
||||
'9A': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
||||
'9B': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
||||
'9E': {'OS': 'VSTA / ForthOS','Description': 'ForthOS (eForth port)'},
|
||||
'9F': {'OS': 'BSD/OS 3.0+, BSDI','Description': 'Unknown'},
|
||||
'A0': {'OS': 'HP/Phoenix/IBM/Toshiba/Sony','Description': 'Diagnostic for HP/Hibernate'},
|
||||
'A1': {'OS': 'HP / Phoenix, NEC','Description': 'HP Vol Expansion/Hibernate'},
|
||||
'A2': {'OS': 'Cyclone V','Description': 'Hard Processor System (HPS)'},
|
||||
'A3': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'A4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'A5': {'OS': 'BSD','Description': 'BSD slice'},
|
||||
'A6': {'OS': 'OpenBSD','Description': 'HP Vol Expansion/BSD slice'},
|
||||
'A7': {'OS': 'NeXT','Description': 'NeXTSTEP'},
|
||||
'A8': {'OS': 'Darwin, Mac OS X','Description': 'Apple Darwin, Mac OS X UFS'},
|
||||
'A9': {'OS': 'NetBSD','Description': 'NetBSD slice'},
|
||||
'AA': {'OS': 'MS-DOS','Description': 'Olivetti DOS FAT12(1.44 MB)'},
|
||||
'AB': {'OS': 'Darwin, Mac OS X / GO! OS','Description': 'Apple Darwin/OS X boot/GO!'},
|
||||
'AD': {'OS': 'RISC OS','Description': 'ADFS / FileCore format'},
|
||||
'AE': {'OS': 'ShagOS','Description': 'ShagOS file system'},
|
||||
'AF': {'OS': 'ShagOS','Description': 'OS X HFS & HFS+/ShagOS Swap'},
|
||||
'B0': {'OS': 'Boot-Star','Description': 'Boot-Star dummy partition'},
|
||||
'B1': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
||||
'B2': {'OS': 'QNX 6.x','Description': 'QNX Neutrino power-safe FS'},
|
||||
'B3': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
||||
'B4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'B6': {'OS': 'Windows NT 4 Server','Description': 'HPVolExpansion/FAT16Bmirror'},
|
||||
'B7': {'OS': 'BSDI / Windows NT 4 Server','Description': 'BSDI,Swap,HPFS/NTFS mirror'},
|
||||
'B8': {'OS': 'BSDI (before 3.0)','Description': 'BSDI Swap / native FS'},
|
||||
'BB': {'OS': 'Acronis/BootWizard/WinNT 4','Description': 'BootWizard/OEM/FAT32 mirror'},
|
||||
'BC': {'OS': 'Acronis/WinNT/BackupCapsule','Description': 'FAT32RAID/SecureZone/Backup'},
|
||||
'BD': {'OS': 'BonnyDOS/286','Description': 'Unknown'},
|
||||
'BE': {'OS': 'Solaris 8','Description': 'Solaris 8 boot'},
|
||||
'BF': {'OS': 'Solaris','Description': 'Solaris x86'},
|
||||
'C0': {'OS': 'DR-DOS,MultiuserDOS,REAL/32','Description': 'Secured FAT (under 32 MB)'},
|
||||
'C1': {'OS': 'DR DOS','Description': 'Secured FAT12'},
|
||||
'C2': {'OS': 'Power Boot','Description': 'Hidden Linux native FS'},
|
||||
'C3': {'OS': 'Power Boot','Description': 'Hidden Linux Swap'},
|
||||
'C4': {'OS': 'DR DOS','Description': 'Secured FAT16'},
|
||||
'C5': {'OS': 'DR DOS','Description': 'Secured extended partition'},
|
||||
'C6': {'OS': 'DR DOS / WinNT 4 Server','Description': 'Secured FAT16B/FAT16Bmirror'},
|
||||
'C7': {'OS': 'Syrinx / WinNT 4 Server','Description': 'Syrinx boot/HPFS/NTFSmirror'},
|
||||
'C8': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'C9': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'CA': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'CB': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'},
|
||||
'CC': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'},
|
||||
'CD': {'OS': 'CTOS','Description': 'Memory dump'},
|
||||
'CE': {'OS': 'DR-DOSx','Description': 'Secured FAT16B'},
|
||||
'CF': {'OS': 'DR-DOSx','Description': 'Secured extended partition'},
|
||||
'D0': {'OS': 'Multiuser DOS, REAL/32','Description': 'Secured FAT (over 32 MB)'},
|
||||
'D1': {'OS': 'Multiuser DOS','Description': 'Secured FAT12'},
|
||||
'D4': {'OS': 'Multiuser DOS','Description': 'Secured FAT16'},
|
||||
'D5': {'OS': 'Multiuser DOS','Description': 'Secured extended partition'},
|
||||
'D6': {'OS': 'Multiuser DOS','Description': 'Secured FAT16B'},
|
||||
'D8': {'OS': 'Digital Research','Description': 'CP/M-86 [citation needed]'},
|
||||
'DA': {'OS': 'Powercopy Backup','Description': 'Non-FS data / Shielded disk'},
|
||||
'DB': {'OS': 'CP/M-86/CDOS/CTOS/D800/DRMK','Description': 'CP/M-86/ConcDOS/Boot/FAT32'},
|
||||
'DD': {'OS': 'CTOS','Description': 'Hidden memory dump'},
|
||||
'DE': {'OS': 'Dell','Description': 'FAT16 utility/diagnostic'},
|
||||
'DF': {'OS': 'DG/UX / BootIt / Aviion','Description': 'DG/UX Virt DiskMan / EMBRM'},
|
||||
'E0': {'OS': 'STMicroelectronics','Description': 'ST AVFS'},
|
||||
'E1': {'OS': 'SpeedStor','Description': 'ExtendedFAT12 >1023cylinder'},
|
||||
'E2': {'Description': 'DOS read-only (XFDISK)'},
|
||||
'E3': {'OS': 'SpeedStor','Description': 'DOS read-only'},
|
||||
'E4': {'OS': 'SpeedStor','Description': 'ExtendedFAT16 <1024cylinder'},
|
||||
'E5': {'OS': 'Tandy MS-DOS','Description': 'Logical FAT12 or FAT16'},
|
||||
'E6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'E8': {'OS': 'LUKS','Description': 'Linux Unified Key Setup'},
|
||||
'EB': {'OS': 'BeOS, Haiku','Description': 'BFS'},
|
||||
'EC': {'OS': 'SkyOS','Description': 'SkyFS'},
|
||||
'ED': {'OS': 'Sprytix / EDD 4','Description': 'EDC loader / GPT hybrid MBR'},
|
||||
'EE': {'OS': 'EFI','Description': 'GPT protective MBR'},
|
||||
'EF': {'OS': 'EFI','Description': 'EFI system partition'},
|
||||
'F0': {'OS': 'Linux / OS/32','Description': 'PA-RISC Linux boot loader.'},
|
||||
'F1': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F2': {'OS': 'SperryIT DOS/Unisys DOS','Description': 'Logical FAT12/FAT16'},
|
||||
'F3': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F4': {'OS': 'SpeedStor / Prologue','Description': '"large"DOS part/NGF/TwinFS'},
|
||||
'F5': {'OS': 'Prologue','Description': 'MD0-MD9 part for NGF/TwinFS'},
|
||||
'F6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F7': {'OS': 'O.S.G. / X1','Description': 'EFAT / Solid State FS'},
|
||||
'F9': {'OS': 'Linux','Description': 'pCache ext2/ext3 cache'},
|
||||
'FA': {'OS': 'Bochs','Description': 'x86 emulator'},
|
||||
'FB': {'OS': 'VMware','Description': 'VMware VMFS partition'},
|
||||
'FC': {'OS': 'VMware','Description': 'Swap / VMKCORE kernel dump'},
|
||||
'FD': {'OS': 'Linux / FreeDOS','Description': 'LinuxRAID/Reserved4FreeDOS'},
|
||||
'FE': {'OS': 'SpeedStor/LANstep/NT/Linux','Description': 'PS/2/DiskAdmin/old LinuxLVM'},
|
||||
'FF': {'OS': 'XENIX','Description': 'XENIX bad block table'},
|
||||
'00000000-0000-0000-0000-000000000000': {'Description': 'Unused entry'},
|
||||
'024DEE41-33E7-11D3-9D69-0008C781F39F': {'Description': 'MBR partition scheme'},
|
||||
'C12A7328-F81F-11D2-BA4B-00A0C93EC93B': {'Description': 'EFI System partition'},
|
||||
'21686148-6449-6E6F-744E-656564454649': {'Description': 'BIOS Boot partition'},
|
||||
'D3BFE2DE-3DAF-11DF-BA40-E3A556D89593': {'Description': 'Intel Fast Flash (iFFS) partition (for Intel Rapid Start technology)'},
|
||||
'F4019732-066E-4E12-8273-346C5641494F': {'Description': 'Sony boot partition'},
|
||||
'BFBFAFE7-A34F-448A-9A5B-6213EB736C22': {'Description': 'Lenovo boot partition'},
|
||||
'E3C9E316-0B5C-4DB8-817D-F92DF00215AE': {'OS': 'Windows', 'Description': 'Microsoft Reserved Partition (MSR)'},
|
||||
'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7': {'OS': 'Windows', 'Description': 'Basic data partition'},
|
||||
'5808C8AA-7E8F-42E0-85D2-E1E90434CFB3': {'OS': 'Windows', 'Description': 'Logical Disk Manager (LDM) metadata partition'},
|
||||
'AF9B60A0-1431-4F62-BC68-3311714A69AD': {'OS': 'Windows', 'Description': 'Logical Disk Manager data partition'},
|
||||
'DE94BBA4-06D1-4D40-A16A-BFD50179D6AC': {'OS': 'Windows', 'Description': 'Windows Recovery Environment'},
|
||||
'37AFFC90-EF7D-4E96-91C3-2D7AE055B174': {'OS': 'Windows', 'Description': 'IBM General Parallel File System (GPFS) partition'},
|
||||
'E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D': {'OS': 'Windows', 'Description': 'Storage Spaces partition'},
|
||||
'75894C1E-3AEB-11D3-B7C1-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Data partition'},
|
||||
'E2A1E728-32E3-11D6-A682-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Service Partition'},
|
||||
'0FC63DAF-8483-4772-8E79-3D69D8477DE4': {'OS': 'Linux', 'Description': 'Linux filesystem data'},
|
||||
'A19D880F-05FC-4D3B-A006-743F0F84911E': {'OS': 'Linux', 'Description': 'RAID partition'},
|
||||
'44479540-F297-41B2-9AF7-D131D5F0458A': {'OS': 'Linux', 'Description': 'Root partition (x86)'},
|
||||
'4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709': {'OS': 'Linux', 'Description': 'Root partition (x86-64)'},
|
||||
'69DAD710-2CE4-4E3C-B16C-21A1D49ABED3': {'OS': 'Linux', 'Description': 'Root partition (32-bit ARM)'},
|
||||
'B921B045-1DF0-41C3-AF44-4C6F280D3FAE': {'OS': 'Linux', 'Description': 'Root partition (64-bit ARM)/AArch64)'},
|
||||
'0657FD6D-A4AB-43C4-84E5-0933C84B4F4F': {'OS': 'Linux', 'Description': 'Swap partition'},
|
||||
'E6D6D379-F507-44C2-A23C-238F2A3DF928': {'OS': 'Linux', 'Description': 'Logical Volume Manager (LVM) partition'},
|
||||
'933AC7E1-2EB4-4F13-B844-0E14E2AEF915': {'OS': 'Linux', 'Description': '/home partition'},
|
||||
'3B8F8425-20E0-4F3B-907F-1A25A76F98E8': {'OS': 'Linux', 'Description': '/srv (server data) partition'},
|
||||
'7FFEC5C9-2D00-49B7-8941-3EA10A5586B7': {'OS': 'Linux', 'Description': 'Plain dm-crypt partition'},
|
||||
'CA7D7CCB-63ED-4C53-861C-1742536059CC': {'OS': 'Linux', 'Description': 'LUKS partition'},
|
||||
'8DA63339-0007-60C0-C436-083AC8230908': {'OS': 'Linux', 'Description': 'Reserved'},
|
||||
'83BD6B9D-7F41-11DC-BE0B-001560B84F0F': {'OS': 'FreeBSD', 'Description': 'Boot partition'},
|
||||
'516E7CB4-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Data partition'},
|
||||
'516E7CB5-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Swap partition'},
|
||||
'516E7CB6-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Unix File System (UFS) partition'},
|
||||
'516E7CB8-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Vinum volume manager partition'},
|
||||
'516E7CBA-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'ZFS partition'},
|
||||
'48465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Hierarchical File System Plus (HFS+) partition'},
|
||||
'55465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple UFS'},
|
||||
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'OS X Darwin', 'Description': 'ZFS'},
|
||||
'52414944-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple RAID partition'},
|
||||
'52414944-5F4F-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple RAID partition, offline'},
|
||||
'426F6F74-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Boot partition (Recovery HD)'},
|
||||
'4C616265-6C00-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Label'},
|
||||
'5265636F-7665-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple TV Recovery partition'},
|
||||
'53746F72-6167-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Core Storage (i.e. Lion FileVault) partition'},
|
||||
'6A82CB45-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Boot partition'},
|
||||
'6A85CF4D-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Root partition'},
|
||||
'6A87C46F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Swap partition'},
|
||||
'6A8B642B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Backup partition'},
|
||||
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/usr partition'},
|
||||
'6A8EF2E9-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/var partition'},
|
||||
'6A90BA39-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/home partition'},
|
||||
'6A9283A5-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Alternate sector'},
|
||||
'6A945A3B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Reserved partition'},
|
||||
'6A9630D1-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A980767-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A96237F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A8D2AC7-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'49F48D32-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Swap partition'},
|
||||
'49F48D5A-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'FFS partition'},
|
||||
'49F48D82-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'LFS partition'},
|
||||
'49F48DAA-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'RAID partition'},
|
||||
'2DB519C4-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Concatenated partition'},
|
||||
'2DB519EC-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Encrypted partition'},
|
||||
'FE3A2A5D-4F32-41A7-B725-ACCC3285A309': {'OS': 'ChromeOS', 'Description': 'ChromeOS kernel'},
|
||||
'3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC': {'OS': 'ChromeOS', 'Description': 'ChromeOS rootfs'},
|
||||
'2E0A753D-9E48-43B0-8337-B15192CB1B5E': {'OS': 'ChromeOS', 'Description': 'ChromeOS future use'},
|
||||
'42465331-3BA3-10F1-802A-4861696B7521': {'OS': 'Haiku', 'Description': 'Haiku BFS'},
|
||||
'85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Boot partition'},
|
||||
'85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Data partition'},
|
||||
'85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Swap partition'},
|
||||
'0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Unix File System (UFS) partition'},
|
||||
'85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Vinum volume manager partition'},
|
||||
'85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'ZFS partition'},
|
||||
'45B0969E-9B03-4F30-B4C6-B4B80CEFF106': {'OS': 'Ceph', 'Description': 'Ceph Journal'},
|
||||
'45B0969E-9B03-4F30-B4C6-5EC00CEFF106': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt Encrypted Journal'},
|
||||
'4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph OSD'},
|
||||
'4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt OSD'},
|
||||
'89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph disk in creation'},
|
||||
'89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt disk in creation'},
|
||||
'824CC7A0-36A8-11E3-890A-952519AD3F61': {'OS': 'OpenBSD', 'Description': 'Data partition'},
|
||||
'CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1': {'OS': 'QNX', 'Description': 'Power-safe (QNX6) file system'},
|
||||
'C91818F9-8025-47AF-89D2-F030D7000C2C': {'OS': 'Plan 9', 'Description': 'Plan 9 partition'},
|
||||
'9D275380-40AD-11DB-BF97-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'vmkcore (coredump partition)'},
|
||||
'AA31E02A-400F-11DB-9590-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMFS filesystem partition'},
|
||||
'9198EFFC-31C0-11DB-8F78-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMware Reserved'},
|
||||
'2568845D-2332-4675-BC39-8FA5A4748D15': {'OS': 'Android-IA', 'Description': 'Bootloader'},
|
||||
'114EAFFE-1552-4022-B26E-9B053604CF84': {'OS': 'Android-IA', 'Description': 'Bootloader2'},
|
||||
'49A4D17F-93A3-45C1-A0DE-F50B2EBE2599': {'OS': 'Android-IA', 'Description': 'Boot'},
|
||||
'4177C722-9E92-4AAB-8644-43502BFD5506': {'OS': 'Android-IA', 'Description': 'Recovery'},
|
||||
'EF32A33B-A409-486C-9141-9FFB711F6266': {'OS': 'Android-IA', 'Description': 'Misc'},
|
||||
'20AC26BE-20B7-11E3-84C5-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Metadata'},
|
||||
'38F428E6-D326-425D-9140-6E0EA133647C': {'OS': 'Android-IA', 'Description': 'System'},
|
||||
'A893EF21-E428-470A-9E55-0668FD91A2D9': {'OS': 'Android-IA', 'Description': 'Cache'},
|
||||
'DC76DDA9-5AC1-491C-AF42-A82591580C0D': {'OS': 'Android-IA', 'Description': 'Data'},
|
||||
'EBC597D0-2053-4B15-8B64-E0AAC75F4DB1': {'OS': 'Android-IA', 'Description': 'Persistent'},
|
||||
'8F68CC74-C5E5-48DA-BE91-A0C8C15E9C80': {'OS': 'Android-IA', 'Description': 'Factory'},
|
||||
'767941D0-2085-11E3-AD3B-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Fastboot / Tertiary'},
|
||||
'AC6D7924-EB71-4DF8-B48D-E267B27148FF': {'OS': 'Android-IA', 'Description': 'OEM'},
|
||||
'7412F7D5-A156-4B13-81DC-867174929325': {'OS': 'ONIE', 'Description': 'Boot'},
|
||||
'D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149': {'OS': 'ONIE', 'Description': 'Config'},
|
||||
'9E1A2D38-C612-4316-AA26-8B49521E5A8B': {'OS': 'PowerPC', 'Description': 'PReP boot'},
|
||||
'BC13C2FF-59E6-4262-A352-B275FD6F7172': {'OS': 'Freedesktop', 'Description': 'Extended Boot Partition ($BOOT)'},
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
# Wizard Kit: Settings - Sources
|
||||
|
||||
SOURCE_URLS = {
|
||||
'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1801120058/AcroRdrDC1801120058_en_US.exe',
|
||||
'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1901020069/AcroRdrDC1901020069_en_US.exe',
|
||||
'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner',
|
||||
'AIDA64': 'http://download.aida64.com/aida64engineer597.zip',
|
||||
'AIDA64': 'http://download.aida64.com/aida64engineer599.zip',
|
||||
'aria2': 'https://github.com/aria2/aria2/releases/download/release-1.34.0/aria2-1.34.0-win-32bit-build1.zip',
|
||||
'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip',
|
||||
'BleachBit': 'https://download.bleachbit.org/BleachBit-2.0-portable.zip',
|
||||
|
|
@ -13,32 +13,32 @@ SOURCE_URLS = {
|
|||
'ClassicStartSkin': 'http://www.classicshell.net/forum/download/file.php?id=3001&sid=9a195960d98fd754867dcb63d9315335',
|
||||
'Du': 'https://download.sysinternals.com/files/DU.zip',
|
||||
'ERUNT': 'http://www.aumha.org/downloads/erunt.zip',
|
||||
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.895.x86.zip',
|
||||
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.895.x64.zip',
|
||||
'FastCopy': 'http://ftp.vector.co.jp/70/64/2323/FastCopy354_installer.zip',
|
||||
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/1056733/ublock_origin-1.16.20-an+fx.xpi',
|
||||
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.924.x86.zip',
|
||||
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.924.x64.zip',
|
||||
'FastCopy': 'http://ftp.vector.co.jp/70/93/2323/FastCopy361_installer.exe',
|
||||
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/1166954/ublock_origin-1.17.4-an+fx.xpi',
|
||||
'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe',
|
||||
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
|
||||
'HWiNFO': 'http://app.oldfoss.com:81/download/HWiNFO/hwi_588.zip',
|
||||
'Intel SSD Toolbox': r'https://downloadmirror.intel.com/27656/eng/Intel%20SSD%20Toolbox%20-%20v3.5.2.exe',
|
||||
'IOBit_Uninstaller': 'https://portableapps.duckduckgo.com/IObitUninstallerPortable_7.5.0.7.paf.exe',
|
||||
'HWiNFO': 'http://files2.majorgeeks.com/caae8849cf31a8d77c51283b720e60e49ce1dc78/systeminfo/hwi_600.zip',
|
||||
'Intel SSD Toolbox': r'https://downloadmirror.intel.com/28447/eng/Intel%20SSD%20Toolbox%20-%20v3.5.8.exe',
|
||||
'IOBit_Uninstaller': r'https://portableapps.com/redirect/?a=IObitUninstallerPortable&s=s&d=pa&f=IObitUninstallerPortable_7.5.0.7.paf.exe',
|
||||
'KVRT': 'http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe',
|
||||
'Macs Fan Control': 'https://www.crystalidea.com/downloads/macsfancontrol_setup.exe',
|
||||
'NirCmd32': 'https://www.nirsoft.net/utils/nircmd.zip',
|
||||
'NirCmd64': 'https://www.nirsoft.net/utils/nircmd-x64.zip',
|
||||
'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.5.8/npp.7.5.8.bin.minimalist.7z',
|
||||
'Office Deployment Tool 2016': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_10810.33603.exe',
|
||||
'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.6.2/npp.7.6.2.bin.minimalist.7z',
|
||||
'Office Deployment Tool': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_11107-33602.exe',
|
||||
'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip',
|
||||
'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip',
|
||||
'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip',
|
||||
'RKill': 'https://www.bleepingcomputer.com/download/rkill/dl/10/',
|
||||
'Samsung Magician': 'https://s3.ap-northeast-2.amazonaws.com/global.semi.static/SAMSUNG_SSD_v5_2_1_180523/CD0CFAC4675B9E502899B41BE00525C3909ECE3AD57CC1A2FB6B74A766B2A1EA/Samsung_Magician_Installer.zip',
|
||||
'Samsung Magician': 'https://s3.ap-northeast-2.amazonaws.com/global.semi.static/SAMSUNG_SSD_v5_3_0_181121/CD0C7CC1BE00525FAC4675B9E502899B41D5C3909ECE3AA2FB6B74A766B2A1EA/Samsung_Magician_Installer.zip',
|
||||
'SDIO Themes': 'http://snappy-driver-installer.org/downloads/SDIO_Themes.zip',
|
||||
'SDIO Torrent': 'http://snappy-driver-installer.org/downloads/SDIO_Update.torrent',
|
||||
'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe',
|
||||
'TestDisk': 'https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip',
|
||||
'wimlib32': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip',
|
||||
'wimlib64': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-bin.zip',
|
||||
'wimlib32': 'https://wimlib.net/downloads/wimlib-1.13.0-windows-i686-bin.zip',
|
||||
'wimlib64': 'https://wimlib.net/downloads/wimlib-1.13.0-windows-x86_64-bin.zip',
|
||||
'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip',
|
||||
'WizTree': 'https://antibody-software.com/files/wiztree_3_26_portable.zip',
|
||||
'XMPlay 7z': 'https://support.xmplay.com/files/16/xmp-7z.zip?v=800962',
|
||||
|
|
@ -172,7 +172,7 @@ NINITE_SOURCES = {
|
|||
'Launchy.exe': 'launchy',
|
||||
'RealVNC.exe': 'realvnc',
|
||||
'Revo Uninstaller.exe': 'revo',
|
||||
'TeamViewer 13.exe': 'teamviewer13',
|
||||
'TeamViewer 14.exe': 'teamviewer14',
|
||||
'TeraCopy.exe': 'teracopy',
|
||||
'WinDirStat.exe': 'windirstat',
|
||||
},
|
||||
|
|
@ -191,12 +191,14 @@ RST_SOURCES = {
|
|||
'SetupRST_14.0.exe': 'https://downloadmirror.intel.com/25091/eng/SetupRST.exe',
|
||||
'SetupRST_14.8.exe': 'https://downloadmirror.intel.com/26759/eng/setuprst.exe',
|
||||
'SetupRST_15.8.exe': 'https://downloadmirror.intel.com/27442/eng/SetupRST.exe',
|
||||
'SetupRST_15.9.exe': 'https://downloadmirror.intel.com/27400/eng/SetupRST.exe',
|
||||
'SetupRST_16.0.exe': 'https://downloadmirror.intel.com/27681/eng/SetupRST.exe',
|
||||
'SetupRST_16.5.exe': 'https://downloadmirror.intel.com/27984/eng/SetupRST.exe',
|
||||
#SetupRST_15.9.exe : Deprecated by Intel
|
||||
#SetupRST_16.0.exe : Deprecated by Intel
|
||||
#SetupRST_16.5.exe : Deprecated by Intel
|
||||
#SetupRST_16.7.exe : Deprecated by Intel
|
||||
'SetupRST_16.8.exe': 'https://downloadmirror.intel.com/28400/eng/SetupRST.exe',
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=4 sw=4 ts=4 tw=0 nowrap
|
||||
# vim: sts=2 sw=2 ts=2 tw=0
|
||||
|
|
|
|||
|
|
@ -54,3 +54,5 @@ TOOLS = {
|
|||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Wizard Kit: Settings - Windows Builds
|
||||
|
||||
WINDOWS_BUILDS = {
|
||||
# Build Version Release Codename Marketing Name Notes
|
||||
# Build, Version, Release, Codename, Marketing Name, Notes
|
||||
'6000': ('Vista', 'RTM', 'Longhorn', None, 'unsupported'),
|
||||
'6000': ('Vista', 'RTM', 'Longhorn', None, 'unsupported'),
|
||||
'6001': ('Vista', 'SP1', 'Longhorn', None, 'unsupported'),
|
||||
|
|
@ -90,7 +90,7 @@ WINDOWS_BUILDS = {
|
|||
'15058': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||
'15060': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||
'15061': ('10', None, 'Redstone 2', None, 'preview build'),
|
||||
'15063': ( '10', 'v1703', 'Redstone 2', 'Creators Update', 'outdated'),
|
||||
'15063': ('10', 'v1703', 'Redstone 2', 'Creators Update', 'unsupported'),
|
||||
'16170': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||
'16176': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||
'16179': ('10', None, 'Redstone 3', None, 'preview build'),
|
||||
|
|
@ -137,7 +137,7 @@ WINDOWS_BUILDS = {
|
|||
'17127': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||
'17128': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||
'17133': ('10', None, 'Redstone 4', None, 'preview build'),
|
||||
'17134': ( '10', 'v1803', 'Redstone 4', 'April 2018 Update', None),
|
||||
'17134': ('10', 'v1803', 'Redstone 4', 'April 2018 Update', 'outdated'),
|
||||
'17604': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||
'17618': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||
'17623': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||
|
|
@ -170,7 +170,7 @@ WINDOWS_BUILDS = {
|
|||
'17755': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||
'17758': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||
'17760': ('10', None, 'Redstone 5', None, 'preview build'),
|
||||
'17763': ( '10', 'v1809', 'Redstone 5', 'October 2018 Update', 'preview build'),
|
||||
'17763': ('10', 'v1809', 'Redstone 5', 'October 2018 Update', None),
|
||||
'18204': ('10', None, '19H1', None, 'preview build'),
|
||||
'18214': ('10', None, '19H1', None, 'preview build'),
|
||||
'18219': ('10', None, '19H1', None, 'preview build'),
|
||||
|
|
@ -179,7 +179,17 @@ WINDOWS_BUILDS = {
|
|||
'18242': ('10', None, '19H1', None, 'preview build'),
|
||||
'18247': ('10', None, '19H1', None, 'preview build'),
|
||||
'18252': ('10', None, '19H1', None, 'preview build'),
|
||||
'18262': ('10', None, '19H1', None, 'preview build'),
|
||||
'18267': ('10', None, '19H1', None, 'preview build'),
|
||||
'18272': ('10', None, '19H1', None, 'preview build'),
|
||||
'18277': ('10', None, '19H1', None, 'preview build'),
|
||||
'18282': ('10', None, '19H1', None, 'preview build'),
|
||||
'18290': ('10', None, '19H1', None, 'preview build'),
|
||||
'18298': ('10', None, '19H1', None, 'preview build'),
|
||||
'18305': ('10', None, '19H1', None, 'preview build'),
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SFC Tool'.format(KIT_NAME_FULL))
|
||||
|
|
@ -37,3 +36,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,14 +4,13 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.activation import *
|
||||
from functions.cleanup import *
|
||||
from functions.diags import *
|
||||
from functions.info import *
|
||||
from functions.product_keys import *
|
||||
from functions.setup import *
|
||||
from functions.sw_diags import *
|
||||
init_global_vars()
|
||||
os.system('title {}: System Checklist Tool'.format(KIT_NAME_FULL))
|
||||
set_log_file('System Checklist.log')
|
||||
|
|
@ -125,4 +124,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=4 sw=4 ts=4
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,13 +4,12 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.browsers import *
|
||||
from functions.diags import *
|
||||
from functions.info import *
|
||||
from functions.product_keys import *
|
||||
from functions.repairs import *
|
||||
from functions.sw_diags import *
|
||||
init_global_vars()
|
||||
os.system('title {}: System Diagnostics Tool'.format(KIT_NAME_FULL))
|
||||
set_log_file('System Diagnostics.log')
|
||||
|
|
@ -171,4 +170,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=4 sw=4 ts=4
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.product_keys import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Transferred Key Finder'.format(KIT_NAME_FULL))
|
||||
|
|
@ -26,3 +25,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.update import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Kit Update Tool'.format(KIT_NAME_FULL))
|
||||
|
|
@ -111,11 +110,6 @@ if __name__ == '__main__':
|
|||
width=40,
|
||||
item = item)
|
||||
|
||||
## Search for network Office/QuickBooks installers & add to LAUNCHERS
|
||||
print_success('Scanning for network installers')
|
||||
scan_for_net_installers(OFFICE_SERVER, 'Office', min_year=2010)
|
||||
scan_for_net_installers(QUICKBOOKS_SERVER, 'QuickBooks', min_year=2015)
|
||||
|
||||
## Generate Launchers
|
||||
print_success('Generating launchers')
|
||||
for section in sorted(LAUNCHERS.keys()):
|
||||
|
|
@ -143,3 +137,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.browsers import *
|
||||
from functions.cleanup import *
|
||||
from functions.setup import *
|
||||
|
|
@ -84,4 +83,4 @@ if __name__ == '__main__':
|
|||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=4 sw=4 ts=4
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.data import *
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
|
|
@ -64,3 +63,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import os
|
|||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
sys.path.append(os.path.dirname(os.path.realpath(__file__)))
|
||||
from functions.winpe_menus import *
|
||||
# Fix 7-Zip name
|
||||
TOOLS['SevenZip'].pop('64')
|
||||
|
|
@ -20,3 +19,5 @@ if __name__ == '__main__':
|
|||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
# vim: sts=2 sw=2 ts=2
|
||||
|
|
|
|||
7
.cbin/_include/_Office/2019_hb_32.xml
Normal file
7
.cbin/_include/_Office/2019_hb_32.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="32" Channel="Current">
|
||||
<Product ID="HomeBusiness2019Retail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
7
.cbin/_include/_Office/2019_hb_64.xml
Normal file
7
.cbin/_include/_Office/2019_hb_64.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="64" Channel="Current">
|
||||
<Product ID="HomeBusiness2019Retail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
7
.cbin/_include/_Office/2019_hs_32.xml
Normal file
7
.cbin/_include/_Office/2019_hs_32.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="32" Channel="Current">
|
||||
<Product ID="HomeStudent2019Retail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
7
.cbin/_include/_Office/2019_hs_64.xml
Normal file
7
.cbin/_include/_Office/2019_hs_64.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="64" Channel="Current">
|
||||
<Product ID="HomeStudent2019Retail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
normal_colour = 'default'
|
||||
header_colour = 'blue'
|
||||
local_fs_colour = 'default'
|
||||
remote_fs_colour = 'green'
|
||||
special_fs_colour = 'yellow'
|
||||
readonly_fs_colour = 'cyan'
|
||||
filled_fs_colour = 'red'
|
||||
full_fs_colour = 'on_red', 'green', 'blink'
|
||||
sizeformat = "-h"
|
||||
column_separator = ' '
|
||||
column_separator_colour = 'none'
|
||||
stretch_screen = 0.3
|
||||
FILL_THRESH = 75.0
|
||||
FULL_THRESH = 85.0
|
||||
format = [
|
||||
('fs', 10, "l"), ('size', 5, "r"),
|
||||
('used', 5, "r"), ('avail', 5, "r"), ('perc', 5, "r"),
|
||||
('bar', 0.1, "l"), ('on', 11, "l")
|
||||
]
|
||||
barchar = '#'
|
||||
bar_fillchar = '.'
|
||||
hidebinds = True
|
||||
mountfile = ['/etc/mtab', '/etc/mnttab', '/proc/mounts']
|
||||
|
||||
|
|
@ -3,19 +3,6 @@ if [ "$(fgconsole 2>/dev/null)" -eq "1" ]; then
|
|||
# Connect to network and update hostname
|
||||
$HOME/.update_network
|
||||
|
||||
# Update settings if using i3
|
||||
if fgrep -q "i3" /proc/cmdline; then
|
||||
sed -i -r 's/#(own_window_type override)/\1/' ~/.conkyrc
|
||||
sed -i -r 's/openbox-session/i3/' ~/.xinitrc
|
||||
fi
|
||||
|
||||
# Update Conky
|
||||
$HOME/.update_conky
|
||||
|
||||
# Start X or HW-diags
|
||||
if ! fgrep -q "nox" /proc/cmdline; then
|
||||
startx >/dev/null
|
||||
else
|
||||
hw-diags cli
|
||||
fi
|
||||
# Start HW-diags
|
||||
hw-diags --cli
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ bindsym $mod+d exec "urxvt -title 'Hardware Diagnostics' -e hw-diags"
|
|||
bindsym $mod+f exec "thunar ~"
|
||||
bindsym $mod+i exec "hardinfo"
|
||||
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 quick"
|
||||
bindsym $mod+s exec "urxvt -title 'Hardware Diagnostics' -e hw-diags --quick"
|
||||
bindsym $mod+t exec "urxvt -e zsh -c 'tmux new-session -A -t general; zsh'"
|
||||
bindsym $mod+v exec "urxvt -title 'Hardware Sensors' -e watch -c -n1 -t hw-sensors"
|
||||
bindsym $mod+w exec "firefox"
|
||||
|
|
@ -324,7 +324,7 @@
|
|||
</keybind>
|
||||
<keybind key="W-s">
|
||||
<action name="Execute">
|
||||
<command>urxvt -title "Hardware Diagnostics" -e hw-diags quick</command>
|
||||
<command>urxvt -title "Hardware Diagnostics" -e hw-diags --quick</command>
|
||||
</action>
|
||||
</keybind>
|
||||
<keybind key="W-t">
|
||||
|
|
@ -92,3 +92,6 @@ else
|
|||
cbatticon --hide-notification &
|
||||
fi
|
||||
|
||||
# Prevent Xorg from being killed by .zlogin
|
||||
touch "/tmp/x_ok"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue