Compare commits

...

2121 commits

Author SHA1 Message Date
875166b683
Replace WMIC sections
Addresses issue #227
2024-11-23 15:27:17 -08:00
179748c469
Add Windows 11 24H2 to version list 2024-11-22 07:27:44 -08:00
ffcee1156a
Remove stale docopt files 2024-09-30 01:52:07 -07:00
edd944a325
Hide extra partitions when building UFDs
Addresses issue #226
2024-09-28 23:22:31 -07:00
75119c15ad
Fix bug in ddrescue-tui argument parsing 2024-09-11 18:11:12 -07:00
e6db63c8b0
Fix typo 2024-09-09 21:43:28 -07:00
e388b77639
Add OSFMount 2024-09-09 21:40:19 -07:00
bbdef56df2
Add OSFMount 2024-09-09 21:05:36 -07:00
6a5a944ea0
Refactor notepad replacement in WinPE
The registry method has proved problematic.  This DOSKEY method seems
less error prone since it's evaluated at runtime.
2024-09-09 20:12:54 -07:00
3621914312
Remove temporary WinPE WIM file 2024-09-08 13:28:31 -07:00
0ef9412995
Switch back to ConEmu in WinPE 2024-09-08 03:53:48 -07:00
0335797a5d
Update WinPE sections 2024-09-08 03:04:33 -07:00
2a07aebff3
Move macOS icons into a tar archive 2024-09-08 00:13:47 -07:00
244d917c73
Drop remaining docopt references 2024-09-04 01:14:34 -07:00
13b8dc8696
Replace remaining docopt sections 2024-09-04 00:53:42 -07:00
58576cbdb4
Use FAT32 for all UFD partitions
This breaks macOS images but those are deprecated at this point.
2024-09-04 00:24:03 -07:00
a3a7b25512
Fix case_insensitive_search 2024-09-04 00:16:54 -07:00
50033f42f6
Move to argparse for ddrescue-tui and hw-diags 2024-09-03 01:12:00 -07:00
d00d625142
Avoid crash when launching SDIO under Windows 11 2024-06-12 19:26:15 -07:00
97842e82f2
Make AVRemover optional 2024-06-03 21:08:59 -07:00
4a54b6e00c
Improve resolution detection when run in a VM 2024-04-27 20:46:23 -07:00
ee7c7c2448
Allow using the live CD/DVD/etc as a source 2024-03-30 23:04:49 -07:00
3aff533c4d
Reduce size to zero-out
Most tools will use a 1MiB offset for the first partition
2024-03-30 23:04:08 -07:00
a256e6e764
Disable finalization options when imaging 2024-03-25 23:01:23 -07:00
cc3e36c60d
Ensure destination exists in ddrescue-tui image 2024-03-25 22:54:57 -07:00
f91eac3ec3
Add Memtest86+ boot options in Syslinux config 2024-03-24 18:52:33 -07:00
667de2d672
Adjust Linux boot options
- CLI option was dropped in Syslinux due to keep the list to a minimum.
Also, its main use was to avoid display issues and nomodeset is a better
option IMO
2024-03-24 18:47:00 -07:00
272fd3e43f
Update tmux sections to reflect upstream changes 2024-03-23 22:35:12 -07:00
58069f9db2
Added 23H2 to windows builds list 2024-03-21 16:04:54 -07:00
33d266f83e
Update more tool configs 2023-11-11 19:53:22 -08:00
e84feb3160
Add AIDA64 config 2023-11-11 18:58:13 -08:00
243fb78837
Add WizTree config 2023-11-11 16:38:58 -08:00
565ec32294
Enable OpenShell under Win11 2023-11-11 15:52:02 -08:00
694eec911b
Drop unused boot option 2023-11-04 17:53:20 -07:00
44b7f786e7
Add UFD macOS boot icon 2023-11-02 20:52:13 -07:00
f7d212d115
Refactor built-ufd to match new Linux builds 2023-11-01 23:30:27 -07:00
3230984a4f
Remove more Archiso customization sections
This will be added to build-ufd
2023-10-27 00:44:58 -07:00
9f4b0ffa82
Remove ISO bootloader override section 2023-10-26 23:19:30 -07:00
75bad41e93
Revert to upstream Linux ISO boot setup
We'll move the WizardKit customization to build-ufd
2023-10-26 00:08:52 -07:00
8602723adb
Use C.UTF-8 to match upstream 2023-10-24 00:29:05 -07:00
b01cb6ed26
Remove haveged and rngd to match upstream 2023-10-23 23:41:24 -07:00
aaae24b790
Suppress linting message 2023-10-22 19:54:51 -07:00
94c8c2ba01
Fix detection of full clones in zero_fill_gaps()
This prevents using the wrong domain size and crashing ddrescue.
2023-10-22 19:53:04 -07:00
80a0d9874a
Drop TDSSKiller
Kaspersky removed the tool from their site, it's probably best to follow that.
2023-10-22 17:41:27 -07:00
e85d9c220e
Update LICENSE.txt 2023-10-21 23:39:28 -07:00
864a546fe3
Rename SDIO config file 2023-10-21 23:28:17 -07:00
3ce134901a
Add config files for BCUninstaller and DDU 2023-10-21 23:01:43 -07:00
6d62bfeaea
Update FastCopy URL 2023-10-21 22:53:27 -07:00
c18e82af75
Add missing DeviceCleanup files 2023-10-21 19:17:50 -07:00
9f5c097f81
Fix typos 2023-10-21 19:11:37 -07:00
42c72f20f4
Run DeviceCleanup and DDU elevated 2023-10-21 19:03:15 -07:00
4e887c318b
Use full tool names 2023-10-21 18:59:37 -07:00
e39a2acf26
Add missing launchers 2023-10-21 18:54:04 -07:00
8ab56ae9d8
Replace UninstallView with BCUninstaller
Addresses issue #223
2023-10-21 18:50:20 -07:00
1c6f0f5f28
Update tool sources 2023-10-21 18:43:54 -07:00
4aedea65c7
Add DeviceCleanup and DDU
Address issue #203
2023-10-21 18:42:30 -07:00
d7067af522
Add data structure description to Sensors() object 2023-10-07 16:36:17 -07:00
484f13dc29
Update embedded_python_env.py 2023-09-23 16:27:34 -07:00
868932c5e4
Remove duplicate code 2023-09-18 11:33:47 -07:00
17a62d6f36
Merge branch 'dev' of gitea.2shirt.work:2Shirt/WizardKit into dev 2023-09-18 11:32:50 -07:00
b20b612315
Update LibreOffice version 2023-09-18 11:30:21 -07:00
73bd58a973
Store average temps in history for use in reports
Addresses #204
2023-09-17 19:40:06 -07:00
33e9cde0f4
Keep history of sensor temps
Needed for #204
2023-09-17 18:11:09 -07:00
ee9d316217
Include serial in ddrescue map name
Addresses issue #200
2023-08-28 15:14:50 -07:00
f7345a8a54
Improve full_disk_clone definition 2023-08-26 17:39:27 -07:00
075a0d8541
Ensure relocate_backup_gpt() is run last
Addresses issue #220
2023-08-26 17:38:27 -07:00
5147a4105f
Simplify finalization menu
Addresses issue #220
2023-08-26 16:57:33 -07:00
d933ec6415
Ignore some unused function arguments 2023-08-26 16:55:25 -07:00
f5681a93d8
Add finalization menu to ddrescue-tui
Addresses issue #220
2023-08-26 16:54:53 -07:00
dbe4a342cc
Fix source_parts usage
Addresses issue #221
2023-08-26 14:30:22 -07:00
460fd9c952
Fix misc typos 2023-08-20 16:09:47 -07:00
7603b93338
Remove temp variable from set_mode() 2023-08-13 20:47:55 -07:00
42720d322b
Move build_block_pair_report() to block_pair.py 2023-08-13 20:47:15 -07:00
6bef46bb4d
Move more logic into wk/clone/block_pair.py 2023-08-13 20:39:23 -07:00
670619b65e
Use new log.format_log_path sub_dir option
This removes the need to import time
2023-08-13 19:47:32 -07:00
b9c4c9c32f
Add sub_dir option to format_log_path 2023-08-13 19:36:38 -07:00
e7642bdc63
Move image sections to wk/clone/image.py 2023-08-13 17:46:31 -07:00
a12995b37d
Move ddrescue classes to separate files 2023-08-13 17:34:14 -07:00
ee34e692dd
Update source/dest earlier in the workflow
Addresses issue #219
2023-08-13 16:31:23 -07:00
2134536960
Remove journalctl alias 2023-08-13 16:15:29 -07:00
47ccd7dd91
Pre-compile Python scripts in build_linux 2023-08-05 14:50:49 -07:00
24e4f7ddcc
Fix pickling ddrescue State() 2023-07-16 18:07:08 -07:00
bddf47816f
Remove duplicate log setup 2023-07-16 17:46:38 -07:00
0c1c65182c
Fix HW Diags test selections for teststations 2023-07-12 12:48:31 -07:00
cda5aee714
Add option to disable password expiration 2023-07-11 11:12:12 -07:00
7c16d13f65
Generate test maps at runtime in ddrescue-tui 2023-07-09 13:58:59 -07:00
840008d8cd
Specify text encoding for zero-fill map file 2023-07-09 13:23:21 -07:00
090a9f2b96
Update ddrescue-tui logging handling 2023-07-09 00:16:46 -07:00
4467369811
Add finalization options to ddrescue-tui
Specifically to zero-fill any gaps from the clone,
to fill the destination with zeros to the end of the device,
and/or to relocate the GPT to the end of the device.
2023-07-08 23:27:05 -07:00
a20fdf7bd3
Only show destination SMART data if present.
Also avoids crash when imaging
2023-07-08 18:58:05 -07:00
df1d2b713f
Simplify _poweroff_source_drive() 2023-07-08 18:37:42 -07:00
4a34f5477d
Add delay to TUI() initialization
Avoids issue where the main menu is printed before the layout is fully
set causing the first few lines to be hidden by the title pane.
2023-07-08 18:32:31 -07:00
0ace951380
Update run_program to avoid linting warnings 2023-07-08 18:10:59 -07:00
6a1cf98d0b
Terminate ddrescue directly instead 2023-07-08 18:10:14 -07:00
8f14fd2442
Fix SMART attribute tracking
Since we've moved to delayed SMART attribute updates we need to set
initial_attributes after we first check the SMART data instead of at
object creation time.
2023-07-08 18:07:55 -07:00
a78a077bdf
Set max idle cutoff to 70* C
Addresses issue #204
2023-07-05 15:51:50 -07:00
d101ec627f
Fix off-by-one bug in tmux.fix_layout()
If resizing both the title and info groups the second group was starting
at a lower initial width.
2023-07-05 15:48:31 -07:00
408a0c6114
Update TUI layout handling
The right column is now created first so the title, info,
current, and worker panes are all in the same "container"
2023-07-05 15:46:27 -07:00
ebd1bbda18
Show SMART data for both devices in ddrescue-tui 2023-07-05 15:00:01 -07:00
7499639c5c
Drop sat,auto detection for smartctl
This was needed twofold.  First is that it was not working as expected
for some time.  Second is that it conflicts with the delayed attribute
updating needed for faster WKClone menus.
2023-07-05 14:57:54 -07:00
d6f3455236
Misc update 2023-07-03 21:27:41 -07:00
55d752dd8b
Use checkmarks in Menu() under ConEmu 2023-07-03 20:45:44 -07:00
f8fc38a78b
Disable highlighting new apps in OpenShell 2023-07-03 20:31:46 -07:00
895d8d2f0a
Disable Bing search desktop widget 2023-07-03 20:25:23 -07:00
815cfde84a
Refactor check_mprime_results() to use sets 2023-07-03 20:16:37 -07:00
9a7fdba3f9
Add warning if cooldown temp is too high vs idle
Addresses issue #204
2023-07-03 20:15:03 -07:00
f9a6850c1a
Split CPU & Cooling tests into separate functions
Addresses issue #204
2023-07-02 15:10:22 -07:00
172f00e4e9
Adjust type hints for NonBlockingStreamReader() 2023-07-02 14:05:20 -07:00
86203a4b86
Use slots for all dataclasses
The minimum Python version was bumped to 3.10 so this is now safe.
2023-06-29 13:48:34 -06:00
8e234ce0cd
Add menu entry for MS Store updates in Auto Setup
Addresses issue #216
2023-06-26 08:20:15 -07:00
9689dcfeab
Update source URLs 2023-06-25 04:10:08 -07:00
cafa2c24fb
Switch to winget where appropriate in Auto Setup
NOTE: Winget is not used for Firefox, LibreOffice, or Open Shell.
This was done because we need more fine-tuned control of the process.
2023-06-25 02:40:43 -07:00
3ff61e9948
Add winget import support 2023-06-25 02:22:04 -07:00
9980dab27b
Add initial winget support 2023-06-25 02:21:26 -07:00
55ce4d8ded
Fix Python dependencies (again) 2023-06-24 23:04:28 -07:00
662f8c1254
Fix bug when running a PowerShell script elevated 2023-06-24 20:32:55 -07:00
d34df7ae07
Add/Update Python dependencies for build_windows 2023-06-24 19:44:20 -07:00
dfcc717048
Open both Microsoft Store and Windows updates
Addresses issue #216
2023-06-24 19:35:12 -07:00
21cbe5d445
Show filesystem type in select_disk_parts() 2023-06-24 18:58:06 -07:00
d94e9097b7
Reduce ESP size to 260MiB 2023-06-24 18:56:31 -07:00
228a5f640e
Adjust TRIM warning message 2023-06-24 18:56:03 -07:00
acd484f891
Check for TRIM in HW Diagnostics and ddrescue-tui
Addresses issue #212
2023-06-17 20:45:44 -07:00
d958945fe8
Relaunch ddrescueview when resuming clone 2023-06-17 20:13:32 -07:00
3e10f2cb8c
Reset layout when aborting HW diagnostics 2023-06-17 18:56:08 -07:00
9810c630f6
Ensure worker panes are added in the proper order 2023-06-17 18:37:56 -07:00
c3bf5f6730
Avoid mixing types for HW Diags main menu 2023-06-17 18:30:33 -07:00
c63b388f81
Small linting refactor 2023-06-17 18:25:12 -07:00
20a0881421
Refactor tmux.fix_layout()
The new code better determines all sizes with splits taken into account.
The non-perfect divisions are also considered when splitting
horizontally.
2023-06-17 18:23:09 -07:00
203ad715e0
Refactor ddrescue-tui source/dest selection
- Re-enables taking images instead of direct cloning!
- Removed some safety checks for clearer code
- We avoid a second scan by reusing the disk_menu object
2023-06-11 15:48:58 -07:00
986c870090
Move ddrescue-tui menus to a separate file 2023-06-10 21:50:56 -07:00
4feb15182e
Rework SMART self-test sections (again)
- Use results from self-test log rather than self-test details
- Include more result details in more scenarios
- Only add self-test results to the report to avoid
  duplicate/conflicting info
- Add check if test started but didn't finish (again?)
2023-06-10 18:59:19 -07:00
88d3ade64d
Avoid background crash when fixing the tmux layout 2023-06-10 18:05:13 -07:00
4202d3c1dc
Adjust cli.ask() log formatting 2023-06-10 17:58:23 -07:00
bcb9228234
Add missing package 2023-06-10 17:56:21 -07:00
f2ab06374b
Revert "Suppress warnings when using tail in tmux"
This reverts commit 3334638a2c.
2023-06-10 17:55:57 -07:00
a2c41fbaf2
Fix destination selection and title pane handling 2023-06-04 19:24:27 -07:00
7e6cfa1896
Add more type hints to ddrescue-tui 2023-06-04 18:54:16 -07:00
13e14e6734
Avoid dangerous default value 2023-06-04 18:13:18 -07:00
45a7f84e19
Restrict journal messages in ddrescue-tui 2023-06-04 18:11:14 -07:00
86f748c599
Clear ddrescue pane when resizing
This replaces the clear every 30s/60s/etc.  It's only enabled while
ddrescue is running to prevent clearing warning messages if printed.
2023-06-04 18:08:59 -07:00
becc564269
Use new TUI layout in ddrescue-tui 2023-06-04 17:43:02 -07:00
7ab6ccbd36
Avoid setting percent to None in tui.py 2023-06-03 18:58:46 -07:00
8e7d202c32
Add reset_title_pane() to tui 2023-06-03 18:58:29 -07:00
05de5c7294
Add type hints to BlockPair 2023-06-03 18:07:30 -07:00
fc2b90a2c0
Raise CPU_CRITICAL_TEMP to 100*C 2023-05-29 17:48:24 -07:00
de7993c39c
Fix type hint for get_known_disk_attributes() 2023-05-29 17:47:58 -07:00
dbb606601d
Drop test() function 2023-05-29 17:32:05 -07:00
1dc22d5991
Remove unused section in layout_needs_fixed() 2023-05-29 17:31:03 -07:00
f50ea711e6
Refactor wk.clone.ddrescue.get_object() 2023-05-29 17:29:02 -07:00
2cce572acf
Drop OrderedDict usage in favor of standard dicts
Python 3.7+ guarantees insertion order is preserved and we (currently)
require 3.10+
2023-05-29 17:25:48 -07:00
a253fdc80f
Add type hints to auto_repairs and auto_setup 2023-05-29 17:09:32 -07:00
386a8b7000
Merge branch 'type-hinting' into dev 2023-05-29 16:26:16 -07:00
a5eb64a055
Add type hints to class instance variables 2023-05-29 16:25:37 -07:00
c009ab2d41
Add even more type hints to function arguments 2023-05-29 16:04:58 -07:00
1bfdb14be4
Refactor color_string() 2023-05-29 14:49:21 -07:00
bf9d994675
Add more type hints to function arguments 2023-05-29 14:01:29 -07:00
f654052f1d
Fix typo 2023-05-29 13:42:45 -07:00
12326a5e2c
Use new Union syntax
This bumps the minimum Python version to 3.10
2023-05-29 12:35:40 -07:00
171cd0019e
Add type hints to function arguments 2023-05-28 20:50:38 -07:00
62edaac25a
Add type hints to functions 2023-05-28 20:09:54 -07:00
60d08a189d
Merge branch 'dev' into type-hinting 2023-05-27 21:15:23 -07:00
69832eda5d
Remove duplicate function wk.log.get_log_filepath 2023-05-27 21:12:27 -07:00
534f258846
Add some type hints 2023-05-27 20:05:03 -07:00
0126452bf1
Merge branch 'ui-split' into dev 2023-05-27 19:50:49 -07:00
3334638a2c
Suppress warnings when using tail in tmux 2023-05-27 19:48:18 -07:00
cb012423bb
Refactor hardware diagnostics to use new TUI 2023-05-27 19:47:26 -07:00
4c76e59238
Add get_window_size() 2023-05-27 19:22:24 -07:00
ba69773fba
Clear history when clearing a pane
Helpful if the pane is resized to prevent cleared lines from returning.
2023-05-27 19:08:48 -07:00
f19c4b2422
Update self-test data before checking result
Addresses #209
2023-05-22 20:59:10 -07:00
59d89575ed
Refactor SMART self-test checks
- Preserve TimedOut status
- Adds last self-test result to notes (if present and result is unknown)
2023-05-21 14:52:28 -07:00
9678f143c7
Misc 2023-05-14 21:59:34 -07:00
7aafcd7c01
Update add_title_pane() to match set_title() 2023-04-09 16:33:11 -07:00
b834be9f00
Close all panes atexit 2023-04-09 16:32:13 -07:00
ba3bf480f7
BREAKING Add wk/ui/tui.py 2023-04-09 15:59:34 -07:00
f9bcd534d4
Move ansi code into wk/ui 2023-04-08 19:20:22 -07:00
d302be2d7c
Use prompt_toolkit for CLI input 2023-04-08 16:26:51 -07:00
13fc64e6ab
Remove unneeded wk.ui calls 2023-04-08 14:16:41 -07:00
44ddb3c258
Replace clear_screen() function
This is now part of wk.ansi and is fully cross-compatible.
2023-04-08 12:45:45 -07:00
95d7159414
Move ANSI color escape sections to their own file 2023-04-02 20:46:54 -07:00
03a143488c
Adjust ui imports and calls 2023-04-02 20:12:18 -07:00
6efc970374
Move tmux sections into wk.ui 2023-04-01 22:36:59 -07:00
e3ebc2d1b8
Merge branch 'dev' into ui-split 2023-04-01 22:28:32 -07:00
96136e8e46
Overwrite .new files if needed
Addresses issue #213
2023-04-01 22:25:11 -07:00
ddb9c4041b
Suppress output when configuring browsers
Addresses #214
2023-04-01 22:20:33 -07:00
9228137187
Fix check_4k_alignment()
Addresses #215
2023-04-01 22:16:38 -07:00
89fd647792
Split wk.std into debug, std, and ui sections 2023-04-01 22:14:03 -07:00
9f66b151af
Replace more pylint sections with ruff 2023-03-26 23:52:52 -07:00
08294caffc
Drop photorec-sort script 2023-03-26 23:09:53 -07:00
7c66eb5e99
Allow password sign-in for MS accounts
Addresses issue #210
2023-03-26 23:04:45 -07:00
d5bc74d21b
Show partition info in 4K alignment check 2023-03-25 20:24:17 -07:00
4f6a07c449
Set Linux as the default boot option 2023-03-19 20:49:32 -07:00
606e657591
Switch to Memtest86+ under UEFI
Memtest86 (by Passmark) still available as an alternate option.
2023-03-19 20:47:36 -07:00
2717ad1a88
Drop pylint reference 2023-03-19 20:21:12 -07:00
10400ec2c3
Add pre-commit hook 2023-03-19 20:13:50 -07:00
bbdc10e0f2
Merge branch 'dev' into ruff-test 2023-03-19 19:45:26 -07:00
16ee95b1d9
Adjust Python module path handling
Simplifies top-level scripts and removes linting exceptions.
2023-03-19 19:42:54 -07:00
e00920f24a
Switch to ruff linting 2023-03-19 18:47:46 -07:00
dad1d3e7f9
Switch to Github release for wimboot 2023-03-18 19:09:02 -07:00
a124b0002b
Remove unused proc var 2023-02-18 14:58:44 -08:00
c888adc1e0
Revert "Fix type causing wrong type to be returned"
This reverts commit 4cc6a5ecd1.
2023-02-16 16:48:01 -08:00
4cc6a5ecd1
Fix type causing wrong type to be returned 2023-02-15 17:36:18 -08:00
ee1f41a1bb
Add VCRedist link 2023-02-07 16:09:33 -08:00
ba1191e425
Add desktop file for OSCViewer 2023-02-04 17:29:38 -08:00
fd9d506ce5
Adjust package lists for OpenSuperClone 2023-02-04 17:29:09 -08:00
9d76502421
Parse KVRT report to create human readable log 2023-02-04 17:22:00 -08:00
f371a4cb83
Limit KVRT scan to Users and ProgramData folders 2023-02-04 17:20:06 -08:00
4f89656edc
Merge branch 'opensuperclone' into dev 2023-01-31 22:41:51 -08:00
4a3bb2cc3f
Revert "Switch to LTS kernel"
This reverts commit f21b95b090.
2023-01-31 22:36:42 -08:00
302ad58814
Remove /utf8 arg from FastCopy launchers
I seems that the FastCopy docs are outdated?
2023-01-02 13:22:07 -08:00
6e4bc11a7e
(Re)add mesa-utils
Needed by the hw-info script
2022-12-23 21:02:13 -08:00
c5b3df3e03
Revert "Update Memtest86 section"
This reverts commit 4a7762f751.
2022-12-23 20:50:12 -08:00
5e95cee2f3
Support kit dir to be at the root of a volume 2022-12-23 19:09:16 -08:00
c235926930
Remove Linux Minimal build
- Merge archiso profiles
- Merge package lists
- Merge full/minimal sections in build_linux
- Remove minimal boot entries
- Remove minimal from build-ufd config and scripts
- Update Linux README.md

Addresses #207
2022-12-17 23:07:35 -08:00
4a7762f751
Update Memtest86 section 2022-12-17 21:44:38 -08:00
3e7d074ca3
Update st package 2022-12-17 20:37:30 -08:00
0e2d51926c
Fix Auto Repairs menu
Reboot entries weren't selected in the default profile due to having
ASCII color escapes.
2022-12-15 20:41:05 -08:00
0ce8169e6b
Skip the main menu when resuming to Auto Repairs
Fixes issue #205
2022-12-15 20:03:05 -08:00
f21b95b090
Switch to LTS kernel 2022-12-15 17:05:29 -08:00
b136462c75
Add dependencies for opensuperclone 2022-12-15 17:04:52 -08:00
137c3ec5e5
Add label for test mode in hardware diagnostics 2022-12-11 21:44:20 -08:00
1dfc7a0243
Add missing build dependencies 2022-12-11 20:56:24 -08:00
786660a625
Add option to install packages in pacinit 2022-12-11 19:08:06 -08:00
a96eacab06
Replace compton (again) 2022-12-03 22:04:26 -08:00
89de2a7679
Avoid crash for devices with bad volume names 2022-11-16 22:41:16 -08:00
2d353cf4e6
Add OpenSuperClone to Linux 2022-11-15 03:35:43 -08:00
76e7994aaa
Switch to mprime-bin
The compiled version is a couple versions out of date?
2022-11-15 03:34:48 -08:00
902ccc7989
Use upstream, precompiled rEFInd binaries
- Needed to allow booting under some MacBook models
2022-11-15 03:33:43 -08:00
e8f86196c8
Refactor Linux dependencies
- Support comments in the package list
- Remove extraneous dependencies
2022-11-15 03:32:30 -08:00
93e4a2e50c
Replace using picom settings 2022-11-12 23:54:11 -08:00
e583929498
Reduce time needed for get_disks() 2022-11-12 23:21:23 -08:00
3922ed08a8
Fix pylint warning W3101 2022-11-12 22:32:25 -08:00
71bbf6ed57
Replace testdisk-wip with testdisk
Needed for dependency issues
2022-11-12 22:20:25 -08:00
f85a03a712
Fix .zlogin in full build 2022-10-30 21:25:02 -07:00
d306a4c4e6
Improve RAM model reporting 2022-10-29 12:06:37 -07:00
b36847fa5c
Skip elevate for Windows Updates 2022-10-23 17:47:07 -07:00
94c1f282f5
Fix reboot entries in Auto Repairs presets 2022-10-23 17:09:08 -07:00
d1ff7a391b
Fix typo 2022-10-23 16:49:42 -07:00
b9202c0ba2
Fix Auto Repairs presets 2022-10-23 16:48:03 -07:00
166ad3198c
Add badblocks support for drives over 16TB 2022-10-23 13:31:37 -07:00
2706d1a9a5
Show failed SMART attributes during disk tests 2022-10-23 13:18:43 -07:00
5c6c123daa
Fix SDIO launcher when SDIO_SERVER not defined 2022-10-22 20:35:05 -07:00
1f984f5b77
Add journalctl-datarec alias 2022-10-22 20:20:17 -07:00
25b64d6852
Limit badblocks scan to minimum in test_mode 2022-10-22 19:41:27 -07:00
a324e71ba9
Open Snappy Driver Instller Origin in AutoSetup
Address issue #202
2022-10-22 18:49:58 -07:00
31de1a20d9
Configure browsers in Additional Users preset.
Addresses issue #202
2022-10-22 18:45:04 -07:00
3d90adf4b2
Add option to run SDIO from network share 2022-10-22 18:24:48 -07:00
eab7a03f70
Update launchers.py 2022-10-19 23:34:51 -07:00
df6d3d4a24
Fix Auto Setup selections under Windows 11 2022-10-19 23:31:20 -07:00
8c03530ec5
Update details before confirming selection 2022-10-19 23:21:23 -07:00
abaed514fb
Fix wk-debug 2022-10-09 00:52:29 -07:00
3d799c2b62
Fix test mode in I/O benchmark test 2022-10-08 22:05:54 -07:00
49ed3c2919
Drop test station name detection via DNS 2022-10-08 20:03:40 -07:00
7dd35e3572
Replace egrep with grep -E 2022-10-08 19:38:45 -07:00
7714b3436f
Track initial and current SMART attributes
Addresses issue #194
2022-10-08 19:26:20 -07:00
4465caa9fd
Skip empty devices 2022-10-08 18:45:31 -07:00
a6a774beae
Update Disk details before checking labels 2022-10-08 18:44:56 -07:00
bb43c7447d
Add wk_debug.py 2022-10-08 18:28:17 -07:00
2c9e56e830
Improve device size reporting in the description
i.e. support 512GB SSDs, 1.5TB HDDs, etc
Addresses issue #199
2022-10-08 16:33:50 -07:00
fc8f81b66d
Open ddrescueview only once per BlockPair 2022-10-08 15:41:54 -07:00
6880a353cc
Set known_attributes when intializing Disk()
This new design uses copy.deepcopy() to avoid erroneous thresholds being
applied to drives during diags.  This also reduces the number of lookups
to one per Disk.
2022-10-08 14:15:32 -07:00
c08ad2b1fb
Avoid crash when saving debug info 2022-10-08 14:00:03 -07:00
591fb8e138
Skip installing Open Shell under Windows 11 2022-10-01 19:15:15 -07:00
a9581c9152
Update OS version sections to support Windows 11 2022-10-01 18:43:44 -07:00
dc2c9955e6
Bump Windows tool versions 2022-09-28 09:32:52 -07:00
5a61ea9abf
Bump psutil version 2022-09-28 09:27:40 -07:00
926b32b574
Clean badblocks results to remove backspaces 2022-09-28 00:33:15 -07:00
5aa49fe5e5
Stomp bugs and typos 2022-09-28 00:33:15 -07:00
d51bf9fe63
Add presets to AutoRepairs 2022-09-28 00:33:15 -07:00
3602665438
Refactor auto_setup.py
Combined the two STATIC VARIABLES sections
2022-09-28 00:33:15 -07:00
e55cc41e2b
Update the AutoRepairs scheduled task every run
This is useful if the kit is being run from a different port and the
letter changed between runs.
2022-09-28 00:33:15 -07:00
2df0bb504f
Reorganize kit layout and update launchers 2022-09-28 00:33:15 -07:00
82e0de422b
Add export_bitlocker.py script 2022-09-28 00:33:15 -07:00
cafdf42a6d
Use same log file for full AutoRepairs session 2022-09-28 00:33:15 -07:00
3b89f1eabc
Support download referer headers and redirects 2022-09-28 00:33:15 -07:00
9f52daeec3
Reduce AutoRepair countdown
Addresses issue #197
2022-09-28 00:33:15 -07:00
dd59f94f85
Replace IOBit with UninstallView 2022-09-28 00:33:15 -07:00
2b42bf9a8c
Update sources 2022-09-28 00:33:14 -07:00
a86649cb29
Update main settings 2022-09-28 00:33:14 -07:00
f008546565
Avoid crashing if a device disconnects mid-diags 2022-09-24 19:58:41 -07:00
21da84e5e2
Update Archiso profile to match upstream changes 2022-09-23 18:25:57 -07:00
a2e1c1fad3
Remove deprecated egrep calls 2022-09-23 18:19:41 -07:00
a97a71a24a
Fix Windows 11 version reporting 2022-09-04 18:10:54 -07:00
5f69e23887
Address Pylint error W1518 2022-09-04 17:44:58 -07:00
d36589751e
Fix mount_volumes() under Linux 2022-09-04 16:57:55 -07:00
5e1cc683fe
Disable Edge first run screen
Addresses issue #193
2022-07-10 15:55:25 -07:00
72640686da
Disable "Let's make Windows even better" screens
Addresses issue #191
2022-07-10 15:48:57 -07:00
df85d3049e
Disable Windows search highlights
Addresses issue #190
2022-07-10 15:42:53 -07:00
38e867d3e3
Lower default skip-size values 2022-07-09 18:52:51 -07:00
9e874f8034
Fix bug locking ddrescue-tui to pass Read-Skip 2022-06-24 10:36:10 -07:00
989fe9f047
Add workaround in Open Shell for S0 LOW POWER IDLE
If the system supports that power state Open Shell can't enter sleep
mode.  The workaround removes the standard sleep option from the list
and adds a new sleep button above the shutdown button that just turns
the monitor off.

Addresses issue #719
2022-06-16 19:27:05 -07:00
301c64be4c
Assume bytes for bare numbers in string_to_bytes() 2022-05-24 16:23:27 -07:00
c4009517e4
Include ddrescueview in Linux builds. 2022-05-24 12:35:34 -07:00
7b13b7de26
Remove useless replace() call 2022-05-24 12:35:10 -07:00
b4547c3555
Remove magic numbers 2022-05-21 17:38:28 -07:00
7abd4c21c3
Refactor Disk children sections
Child devices are not added by default to improve performance.
Disk.children is always present to avoid overly cautious lookups.
2022-05-21 15:03:44 -07:00
193d207d5b
Fix mount-all-volumes 2022-05-21 15:03:34 -07:00
e03956f2fe
Convert Disk description to a property 2022-05-21 14:39:42 -07:00
1616379398
Update mount_volumes to match build_volume_report 2022-05-21 14:35:25 -07:00
29d4e80f7e
Refactor get_disks_macos() to improve performance
Found a way to easily exclude disk images from the list under El Cap
2022-05-20 19:44:12 -07:00
544ffb1aff
Refactor partition table type lookup sections 2022-05-20 17:58:07 -07:00
cf7ed909b3
Remove Python 3.10 requirement 2022-05-20 17:08:10 -07:00
fddd77e6fd
Fix typehint typo 2022-05-19 17:27:49 -07:00
0370ba213b
Add unmount aliases 2022-05-19 15:13:50 -07:00
068f1773aa
Update Linux mount volume sections 2022-05-18 14:59:14 -07:00
4d34e868b2
Update Linux package lists 2022-05-16 15:07:15 -07:00
5fc5cda86d
Avoid adding duplicate attribute failure notes 2022-05-14 17:51:43 -07:00
0ecc4d4146
Add test mode to Hardware Diagnostics
Addresses issue #192
2022-05-14 17:48:04 -07:00
47308c1508
Allow non-integer number of minute countdowns 2022-05-14 16:19:18 -07:00
19e86e0ba0
Update HiDPI sections 2022-05-12 20:35:14 -07:00
eb0e13e794
Patch st to use .Xresources
Enables support for HiDPI systems
2022-05-12 20:35:14 -07:00
859bc990e0
Fix destination size checks
Addresses issue #166
2022-05-01 16:53:48 -07:00
af13a88c81
Merge branch 'refactor-hw' into dev 2022-05-01 16:35:19 -07:00
6642aad2c8
Update ddrescue-tui to use new Disk object vars 2022-05-01 16:20:39 -07:00
2585ed584c
Refactor disk safety checks 2022-04-18 09:21:29 -07:00
95cd3b645d
Remove SMARTSelfTestInProgressError sections
Going forward this is a non-blocking error.
2022-04-11 16:50:21 -06:00
d667695e9e
Move surface scan check to its own function 2022-04-11 14:30:42 -06:00
af8b2b7dd3
Refactor SMART self-test sections 2022-04-08 19:19:23 -06:00
41b4ffd9fb
Cleanup pylint sections 2022-04-08 18:38:55 -06:00
312df1ee9d
Refactor import logic for wk.hw.diags 2022-04-08 15:38:03 -06:00
20f91f01d1
Add type hints to hardware functions 2022-04-06 19:08:23 -06:00
3d7881328f
Move ddrescue out of wk/hw section 2022-04-06 19:08:09 -06:00
f79e578aaf
Remove pylint warning from sensors 2022-04-06 16:23:44 -06:00
46eb737dc8
Move SMART functions to their own file 2022-04-06 16:22:58 -06:00
99dd7661d4
Split hardware diagnostics into multiple files 2022-04-05 18:11:06 -06:00
fc2bb07d11
Track test groups as list instead of a dict
By only including selected tests we can skip checking for the
enabled/disabled status.  This will also simplify the process
of disabling future tests for a disk if a failure is detected.
2022-04-05 14:45:14 -06:00
5ffa6d8261
Replace references to details with attributes 2022-04-04 18:58:45 -06:00
4647efb971
Fix broken import 2022-04-04 18:33:03 -06:00
8582046948
Update HW diags and ddrescue to use new HW classes 2022-04-04 18:31:52 -06:00
56e145942a
Update generate_object_report() to handle slots 2022-04-04 18:31:15 -06:00
172cb398ba
Convert hardware objects to dataclasses 2022-04-04 18:30:21 -06:00
a3abf03a23
Merge branch 'new-ddrescue-arguments' into dev 2022-03-31 17:40:46 -06:00
8dd8701e8d
Split read phase into two parts
Addresses issue #184

The first read phase will skip a lot more to try to recover more data
from the whole source.  Then the second read phase will fill in like
the previous configuration.
2022-03-25 18:45:28 -06:00
4817fe6d1f
Use larger --skip-size by default 2022-03-25 16:53:29 -06:00
817cfc3de7
Skip --reopen-on-error by default for all presets 2022-03-25 15:48:00 -06:00
2a70997a6c
Use sessions in requests when downloading files 2022-03-10 15:36:58 -07:00
4e61025e99
Fix --sector-size argument 2022-03-08 13:02:33 -07:00
b66f25dfea
Only open ddrescueview if running with a DISPLAY 2022-03-08 12:36:49 -07:00
b82493b12b
Generate new map files when starting a recovery
This is done to define the domain size and let us use --complete-only.

This also enables us to open ddrescueview immediately since that tool
requires a valid map file from the start.  If you open an empty map
file ddrescueview doesn't auto-reload the file correctly.

Addresses #184
2022-03-08 11:55:23 -07:00
9d2eb8b175
Fix initial and max skip sizes
ddrescue's minimum is 64KiB so we should respect that.

Addresses #184
2022-03-08 11:53:56 -07:00
ea9e3b3696
Disable broken --sector-size argument
Addresses #184
2022-03-08 11:52:04 -07:00
c3ec690318
Add new ddrescue argument options
Addresses #184
2022-03-07 23:49:15 -07:00
b750432381
Update archiso profile with upstream changes 2022-02-24 17:03:10 -07:00
f58f6d9da1
Update source URLs 2022-02-23 12:47:22 -07:00
027052ee70
Replace hardinfo with hardinfo-gtk3 2022-02-22 13:21:18 -07:00
fe81ccbaff
Replace Alacritty with custom st build 2022-02-22 13:20:59 -07:00
4a0c0d35bc
Add support for locally tracked AUR packages 2022-02-22 13:18:39 -07:00
a35ffdda23
Open ddrescueview during recovery
Addresses issue #182
2022-02-20 18:10:13 -07:00
0ecb7e2933
Update README.md 2022-02-14 03:44:14 -07:00
82a2e7f85c
Add support for renaming macWK boot.efi files
This prevents those boot entries from appearing in the macOS boot menu
2021-12-14 21:04:44 -07:00
6b3524cde8
Update build_macos to support more CLI arguments
If STANDALONE is set then the boot files are left intact.
If STANDALONE is not set then the image is unblessed.

Addresses #178
2021-12-14 21:04:44 -07:00
ef5c61caa9
Add more README.md files
Addresses #177
2021-12-14 15:30:32 -07:00
32d7cd44ff
Save extra image list to UFD to support --update
Addresses #176
2021-12-14 15:08:01 -07:00
a19714d735
Skip CPU tests by default for TestStations
Addresses #179
2021-12-14 14:08:22 -07:00
8075dfe45c
Fix run_adwcleaner() 2021-12-13 22:07:05 -07:00
dc52eba172
Add missing mtools package 2021-12-13 21:16:53 -07:00
3f678e1920
Set correct permissions for authorized_keys 2021-12-13 21:13:50 -07:00
0fb62f4bcd
Add missing memtest86-efi package 2021-12-13 21:13:33 -07:00
125431a767
Update XMPlay skin 2021-12-13 19:29:19 -07:00
3ebfdbbedb
Update tool versions 2021-12-13 17:54:29 -07:00
a7d359e2b0
mprime requires boost to compile 2021-12-09 00:01:29 -07:00
c0e29e5a57
Switch to libldm from ldmtool (AUR) 2021-12-09 00:01:03 -07:00
0e56ccccfd
Remove extraneous registry hive names 2021-12-08 21:26:04 -07:00
93b2422044
Refactor Autologon sections
In some cases when Autologon was skipped initially it was still called in
end_session().  This caused old passwords to be reinstated in some cases.
2021-12-08 21:17:27 -07:00
8ecac36a64
Fix Secure Boot sections 2021-11-10 22:59:25 -07:00
7006a6453d
Add debug console launcher 2021-11-07 19:31:16 -07:00
5fb6dc4205
Fix volume free percentage calculation 2021-11-07 17:35:40 -07:00
6f0ae5a6ad
Set AdwCleaner settings before running 2021-10-28 23:15:28 -06:00
88373c5e10
Update rofi theme 2021-10-28 04:15:39 -06:00
7dac69de14
Fix LibreOffice XCU data 2021-10-27 20:39:45 -06:00
4c0afb498b
Set custom power plan description 2021-10-27 20:25:49 -06:00
545cc20e48
Add support for more encodings for profiles.ini 2021-10-27 20:01:05 -06:00
49e8d5c894
Remove FastCopy setup after extraction 2021-10-27 19:37:19 -06:00
627994973d
Fix bug in build_linux 2021-10-27 18:06:07 -06:00
9fb5a221fb
Remove unused borrowed script 2021-10-27 18:05:43 -06:00
a18a8f8156
Set custom power plan name and sleep timeouts 2021-10-27 18:03:52 -06:00
d3f5cccdb2
Update disable_chrome_notifications() 2021-10-20 23:08:48 -06:00
194f694309
Fix Windows Defender passive mode check 2021-10-20 22:40:41 -06:00
a5a96dd598
Drop 7za in favor of the full version 2021-10-20 21:59:49 -06:00
b331022520
Replace fgrep usage with grep -F 2021-10-20 21:02:11 -06:00
98f3ebb49e
Change how OS_VERSION is set
By only using the float type for 8.1 we can just print OS_VERSION to get
7, 8, 8.1, 10, and maybe 11?

To future me, sorry if you decide to add type hints to the project.
2021-10-20 20:51:04 -06:00
6a9299dea1
Add bad workaround for now 2021-10-15 02:30:03 -06:00
6d0d929c44
Hide HWiNFO sensor tooltips 2021-10-15 01:24:57 -06:00
7940e3a219
Avoid crash if profiles.ini is using UTF-16 LE BOM 2021-10-15 01:19:24 -06:00
fd27af040b
Accept the Autologon EULA automatically 2021-10-15 01:06:02 -06:00
2f655787e5
Avoid if quitting Auto Repairs without running it
i.e. Opened the script, get to the main menu, and then exit.
2021-10-15 01:04:36 -06:00
cc95bbe68b
Add embedded_python_env.py
Allows for faster debugging when using the embedded version of Python.
2021-10-14 23:59:26 -06:00
7388d94c50
Fix bugs 2021-10-14 23:58:46 -06:00
5d54b6de4b
Use correct bit-depth tools when building the kit
If you use the 32-bit version of ConEmu and/or? Python on a 64-bit OS
then psutil will throw access denied errors when trying to wait for
processes.
2021-10-14 23:55:12 -06:00
ca45fe800f
Remove unused build_additions 2021-10-14 23:24:04 -06:00
c66c39669c
Fix typo 2021-10-14 22:38:04 -06:00
22bde273f2
Add warning that WinPE is under development 2021-10-14 22:36:39 -06:00
2efd84b1df
Preserve ACL in FastCopy
Addresses issue #160
2021-10-14 20:32:51 -06:00
135e7e5d78
Add missing launchers 2021-10-14 20:19:16 -06:00
1ff17f4bb8
Support Prog32.exe stile naming in launchers 2021-10-14 20:12:34 -06:00
1f41a67350
Updated OpenShell sections
There's no point in downloading very X days if the URLs are version locked.
2021-10-14 17:55:15 -06:00
e9d2fb6f40
Add header to README 2021-10-14 17:42:12 -06:00
c5fca8f04f
Use specific versions to select UAC settings 2021-10-14 17:40:07 -06:00
d664100c50
Remove unused folder 2021-10-13 20:56:42 -06:00
a417cc0c64
Update README files 2021-10-13 20:52:35 -06:00
e750a9c66d
Update script descriptions for consistency 2021-10-13 20:50:40 -06:00
fa6183379e
Update macOS build script and move to setup dir 2021-10-13 20:48:41 -06:00
b5021674ee
Remove old code
Finally
2021-10-13 18:31:29 -06:00
ccd6933f51
Add Windows Kit build sections 2021-10-13 17:59:46 -06:00
b7d54e1469
Apply bugfixes 2021-10-13 17:57:19 -06:00
aa0e35cbaa
Add copy_file() function to wk.io 2021-10-13 17:56:47 -06:00
0725674a3b
Update Windows kit layout and update tool configs
Going forward cbin/.cbin will only be used if necessary and not by
default.  This removes a step for most tools when used and better
aligns with the new auto_repairs and auto_setup scripts.
2021-10-13 17:51:55 -06:00
d1b32a786c
Add arch-install-scripts to live image 2021-10-09 19:42:38 -06:00
d4392b7285
Cleanup imports 2021-10-09 17:16:46 -06:00
bc0a358ac0
Update source URLs 2021-10-08 20:53:21 -06:00
2b2f371482
Use run_tool to extract ERUNT 2021-10-08 20:36:46 -06:00
a7779a9c1f
Refactor Windows kit build process for new layout 2021-10-08 20:05:08 -06:00
24269f801c
Update RegDelNull section 2021-10-02 20:02:17 -06:00
e57b859bd3
Remove unused sources 2021-10-02 20:02:04 -06:00
7db0ece687
Move msword-search back to scripts/ 2021-10-02 19:32:24 -06:00
f7e6f88b9c
Merge duplicate efforts to restore UAC defaults 2021-10-02 19:30:59 -06:00
659d71c0eb
Move repair and setup settings to wk/cfg 2021-10-02 19:19:24 -06:00
ba4edcf6f3
Cleanup wk/setup/windows dir 2021-10-02 18:58:16 -06:00
e62a008800
Disable opening news and interests on hover over 2021-10-02 18:07:00 -06:00
6a0fd46523
Add "Custom" option to Auto Setup 2021-09-30 18:55:32 -06:00
4a21ade0b4
Ask selection questions during load_preset() 2021-09-30 18:50:49 -06:00
d214e3f363
Adjust whitelist usage 2021-09-30 17:43:09 -06:00
625539c786
Avoid crash when downloading files 2021-09-30 15:37:06 -06:00
7391c863f9
Old code cleanup 2021-09-30 04:20:39 -06:00
0fc5c4b146
Add initial questions to Auto Setup 2021-09-30 03:38:25 -06:00
02055c5b30
Add open programs sections to Auto Setup 2021-09-30 02:00:16 -06:00
bd0a03e283
Combine browser configuration menu options 2021-09-30 01:59:26 -06:00
eacab48c1e
Add 4K alignment checks to Auto Setup 2021-09-29 20:31:46 -06:00
f1645f80e6
Add AV check to Auto Setup 2021-09-29 20:27:35 -06:00
30e43b9814
Add storage status sections 2021-09-29 19:56:49 -06:00
526f6e26eb
Add installed RAM sections 2021-09-29 01:24:07 -06:00
337b6d95e1
Add activation and Secure Boot sections 2021-09-29 00:59:06 -06:00
423cd343fb
Add show_os_name() with support status checks 2021-09-28 23:23:05 -06:00
d725837f9b
Add AIDA64 sections
Replaced old report profiles with a new basic profile.
Several sections that just slow down the process have been removed.
2021-09-28 19:21:30 -06:00
f0451a9803
Adjust Windows-specific imports and STATIC VARS 2021-09-28 18:34:50 -06:00
90fb97ad91
Fix various pylint warnings 2021-09-27 21:48:11 -06:00
2e485505d4
Skip backup sections if backup previously run 2021-09-27 21:21:09 -06:00
8289df1d62
Don't prepend exception name for WK generic types 2021-09-27 20:49:39 -06:00
528602d98e
Check if activated before getting the BIOS key 2021-09-27 20:48:55 -06:00
bc320b4d87
Add remaining 'Configure System' sections 2021-09-27 20:48:19 -06:00
f9d4b1e3a3
Add UAC sections 2021-09-27 19:44:25 -06:00
7009a074c7
Add BSoD minidump sections 2021-09-27 19:30:12 -06:00
cb3ec42b92
Add functions to disable Chrome notifications 2021-09-27 18:41:34 -06:00
b61f243cc8
Disable display sleep only during auto-repairs 2021-09-27 16:51:01 -06:00
a03d772788
Add software bundle sections 2021-09-27 16:41:57 -06:00
49d7e6d78a
Misc updates 2021-09-25 20:39:08 -06:00
68d8e292cc
Restrict OpenShell installs to Windows 10 2021-09-25 20:37:39 -06:00
b05835d80f
Enable uBlock Origin in more browsers 2021-09-25 20:35:47 -06:00
14ff5a9437
Add Firefox and uBlock Origin sections 2021-09-25 18:11:05 -06:00
578925cb70
Add Open-Shell install sections 2021-09-15 18:02:36 -06:00
38fd38f1ec
Support suffixes other than exe for kit tools 2021-09-15 16:38:11 -06:00
90f2a37531
Rename wk/cfg/tools.py to wk/cfg/sources.py 2021-09-15 16:37:25 -06:00
bec4ed520c
Add LibreOffice install sections 2021-09-15 12:25:32 -06:00
3d984f5f29
Import standard repair functions instead of auto 2021-09-15 09:58:01 -06:00
673a92b323
Add install_vcredists() 2021-09-15 09:56:09 -06:00
e485cc9674
Add Auto Setup scripts 2021-09-15 09:18:02 -06:00
ae4a72036d
Extract ERUNT before running 2021-09-14 19:14:44 -06:00
e90b59853c
Update launch scripts to use new config location 2021-09-14 19:14:01 -06:00
56a8ffea03
Fix path to main.py config file 2021-09-13 20:45:16 -06:00
7dfd399e6e
Update __init__.py files 2021-09-13 18:42:36 -06:00
0e124dc1f2
Skip Autologon cleanup if it wasn't used
We found in a few cases systems starting requiring logon passwords after
Auto Repairs were run.  Autologon might be the cause so we should avoid
running it, and the cleanup, if settings are already present.

Addresses issue #175
2021-08-31 17:06:38 -06:00
e7f6dc6b86
Remove erroneous docstring 2021-08-25 16:05:38 -06:00
24b3c7a8a9
Fix MemTest86 boot entry in rEFInd 2021-08-25 15:55:51 -06:00
c2353ad859
Update archiso profile to match upstream changes 2021-08-25 15:38:38 -06:00
3189fc464a
Add macOS boot options 2021-08-25 12:32:55 -06:00
547038c560
Include our boot files in build_linux ISO files 2021-08-24 20:57:17 -06:00
8cdfb244e8
Enable teststation customization using local files
/run/archiso/bootmnt is only available if booted without using copytoram
2021-08-22 16:16:40 -06:00
7ce67c7844
Add pv package 2021-07-24 19:28:22 -06:00
5620ac882a
Apply more fixes for Alacritty 2021-07-24 19:27:53 -06:00
0a6f0f200b
Drop termite-terminfo package 2021-07-24 18:28:17 -06:00
f61f4397d2
Remove unused .Xresources file 2021-07-24 18:08:19 -06:00
6031b73fb5
Replace termite with alacritty
Termite was removed from the main Arch repos and the devs are
recommending this instead
2021-07-24 18:07:23 -06:00
628592f958
Fix Mac memtest tool sections 2021-07-24 02:40:45 -06:00
dd50852a68
Enable numlock in Linux 2021-07-23 22:58:28 -06:00
07bddaae54
Include memtest in macOS builds 2021-07-23 22:17:32 -06:00
bf6482a594
Fix possible crash in reset_windows_updates()
Auto Repairs could end up in an endless boot loop if
SoftwareDistribution.old exists before running
2021-07-23 21:58:47 -06:00
8a685d4e60
Add option to include extra images in build-ufd 2021-06-30 01:02:03 -06:00
f9f947fab6
Update wk.std.bytes_to_string() 2021-06-29 22:40:40 -06:00
9c5767f71f
Update CPU testing sections 2021-06-23 23:33:45 -06:00
e4fbc7fe69
Prevent 100% CPU usage in NonBlockingStreamReader 2021-06-23 23:30:19 -06:00
d76dca8fd7
Catch and log missing commands
It's better to be explicit in what's going wrong in the case of
a missing command or program.
2021-06-23 21:33:27 -06:00
3cf371177c
Move broken msword-search script to review folder 2021-06-22 20:16:46 -06:00
8e0fdf641b
Retest temps with sysbench if Prime95 runs too hot
If the CPU reaches the failing temps during Prime95 then sysbench will be
run to emulate a less artificial workload.  The both the overall and sysbench
max temps are recorded and shown in the results.

Added new option to track an alternate max temp value in wk.hw.sensors.
This was needed so show two different max temps recorded during CPU testing.

Sysbench was added to the Linux package list and is compiled for macOS.
Without manually compiling the package it brings in way too many dependencies
to support SQL DB testing (which we don't need).
2021-06-17 03:16:34 -06:00
bfea4b9910
Re-add missing ddrescue package to Linux image 2021-05-17 14:57:24 -06:00
93de0645cd
Use custom power plan during Auto Repairs 2021-05-14 15:38:54 -06:00
527a5b2e97
Avoid crash during HW Diagnostics 2021-05-13 21:32:46 -06:00
32b25f912d
Remove with_stem() usage to support Python 3.8 2021-05-13 21:30:52 -06:00
f3e3483b46
Support new Archiso layout in UFD sections 2021-05-13 21:30:32 -06:00
a5b0758d30
Adjust exception formatting in TryAndPrint() 2021-05-13 21:08:38 -06:00
e83bcb864c
Fix Autologon sections 2021-05-13 21:04:39 -06:00
6d3c74e71e
Update Linux package lists 2021-05-08 02:14:46 -06:00
de6ee523b0
Add support for running on Python 3.8 2021-05-07 23:51:48 -06:00
1f618a4152
Run AVRemover on first run of Auto Repairs 2021-05-07 23:50:34 -06:00
b7b8f20e24
Add timezone check to Auto Repairs 2021-05-07 18:18:38 -06:00
59fd85429c
Abort on KeyboardInterrupts 2021-05-07 02:38:55 -06:00
d2fb8250bc
Update backups and quarantine paths 2021-05-07 02:24:57 -06:00
bde9863b98
Add backup browsers sections 2021-05-07 00:31:26 -06:00
4928989913
Fix bug in download_tool()
Skip check to ensure the correct architecture path is returned.
2021-05-05 23:56:12 -06:00
6a00444bd4
Support multiple architectures in get_tool_path()
This change was necessary to avoid using the wrong paths for
tools with speparate executables for different architectures.
2021-05-05 23:29:29 -06:00
4872a18e91
Support tools with multiple architectures 2021-05-05 23:10:38 -06:00
acc3a4dccc
Add extract_tool() function 2021-05-02 02:16:34 -06:00
461bc8ac9c
Merge branch 'auto-repair' into dev 2021-05-02 01:10:45 -06:00
e9db4238ff
Run Autologon before any scans 2021-05-01 21:17:42 -06:00
b1acb6a076
Remove placeholder functions 2021-05-01 20:49:28 -06:00
2d4ae65188
Run KVRT in new pane under ConEmu 2021-05-01 20:41:24 -06:00
6b35d4165d
Add download_tool() function 2021-05-01 20:04:50 -06:00
9b6bfa2760
Make Sync Clock optional 2021-05-01 20:01:01 -06:00
ff43bc79b8
Add uninstaller sections 2021-05-01 20:00:46 -06:00
080e440d23
Add AdwCleaner sections 2021-05-01 19:28:07 -06:00
04b2c1c9d9
Add Microsoft Defender sections 2021-05-01 19:14:32 -06:00
03000662fe
Add KVRT sections 2021-05-01 17:12:11 -06:00
cf8b600dd5
Drop extraneous SYSTEMDRIVE lookups 2021-05-01 17:00:48 -06:00
f706a48f60
Add HMP sections 2021-04-30 03:26:45 -06:00
bdbed4622e
Add BleachBit sections 2021-04-30 02:59:19 -06:00
77920db5b5
Add missing default UAC setting 2021-04-30 02:58:02 -06:00
06b0ff81e1
Add Auto Repairs init functions 2021-04-30 02:09:43 -06:00
e488b2c89c
Avoid crash when downloading tools 2021-04-30 02:08:50 -06:00
447e93ca3a
Resume in ConEmu if started in ConEmu 2021-04-30 00:19:33 -06:00
7f40a52444
Add remaining Windows Repairs functions 2021-04-30 00:06:22 -06:00
e17c96d465
Add auto_chkdsk() 2021-04-29 21:14:12 -06:00
973dad3240
Add "auto_" windows updates functions 2021-04-29 20:17:24 -06:00
078859838a
Add 'Backup Settings' group functions 2021-04-24 20:24:39 -06:00
a7db972ba5
Get repair functions by name instead of full path 2021-04-24 20:23:08 -06:00
1dbad4bafe
Split result variables to result and message
result is for the return variable from TryAndPrint calls.
message is the text to display or save to the registry.
2021-04-24 20:18:45 -06:00
b2c94113d9
Remove date from DEFAULT_LOG_DIR 2021-04-24 19:03:41 -06:00
005d4d1ea6
Search all modules for a matching exception 2021-04-24 16:55:17 -06:00
9a77a5cb9b
Update Auto Repair sections
* Expanded saving/loading settings from registry
* Keep previous selections by default but allow changes
* Print previous session(s) to have the whole session info present
* Changed variable names for clarity (why am I so bad at this?)
2021-04-23 23:57:22 -06:00
10b443f0f5
Add framework for running auto repair groups 2021-04-23 03:20:32 -06:00
c2d3752bc5
Update TryAndPrint() 2021-04-21 23:57:19 -06:00
d200878e0d
Revert update() to private method and add wrapper 2021-04-21 22:27:49 -06:00
125907ed3a
Add Auto Repairs menus 2021-04-21 05:19:27 -06:00
3c748520e1
Don't suppress bells in ConEmu 2021-04-20 22:23:05 -06:00
ee3203c485
Show message when downloading tools 2021-04-20 22:06:03 -06:00
b44fda2ccd
Avoid clobbering files when downloading tools. 2021-04-20 21:14:31 -06:00
cb825e37ba
Add support to run tools from .cbin or online 2021-04-19 01:04:18 -06:00
b8335188ce
Add wk.kit.tools
For code related to downloading, finding, and running tools on the kit.
2021-04-17 17:49:04 -06:00
65cb8481bc
Add wk.repairs section 2021-04-17 14:10:30 -06:00
fd7a8c4066
Add Windows service functions 2021-04-17 12:13:24 -06:00
9351b597c2
Avoid potential crash in run_chkdsk_online() 2021-04-17 11:38:06 -06:00
d722e587b1
Expand warning notice for ddrescue-tui under macOS 2021-04-17 11:26:00 -06:00
7064472e0b
Fix SFC scan 2021-04-16 03:33:47 -06:00
ffa2df416b
Set source drive to sleep instead of detaching it 2021-04-16 01:07:56 -06:00
e088f705ba
Add run_dism() 2021-04-15 23:33:11 -06:00
47b49077da
Show CHKDSK progress in separate pane under ConEmu 2021-04-15 23:31:08 -06:00
943c1e11b9
Retry CHKDSK on failures
Fixes issue #159
2021-04-15 21:13:28 -06:00
ed6f188eb2
Avoid pylint errors under Linux/macOS 2021-04-15 20:04:33 -06:00
759cd12379
Reoder Windows functions 2021-04-15 19:48:36 -06:00
f1592b92a6
Reduce macOS image size
Having a DMG also allows us to use dmg2img to convert into a raw HFS+
image.  That image can be applied to a partition using dd under Linux.
2021-04-15 01:30:56 -06:00
20fe08dbb4
Get correct size for child dev under macOS 2021-04-14 02:16:58 -06:00
a4ee7b890c
Disable image mode in ddrescue-tui (for now) 2021-04-13 23:16:55 -06:00
d781038e88
Enable ddrescue-tui under macOS
Currently limited to only cloning whole disks, not select partitions.
We need to specify the --size due to a bug under macOS; it fails to
detect the size of the device/partition and reports 8192 PiB instead.
2021-04-13 02:18:17 -06:00
535455813c
Use the new command name for pipes.sh 2021-04-11 15:30:32 -06:00
b047b28f30
Fix typo 2021-04-11 15:27:51 -06:00
719e6c457d
Remove stale code 2021-04-10 17:37:46 -06:00
0ed814786a
Show help screens for hw-diags and ddrescue-tui 2021-04-09 18:51:32 -06:00
66bf189e55
Disable benchmark tests on surface scan failures 2021-04-09 03:02:28 -06:00
b3a667641d
Show failed attributes during surface scans 2021-04-09 02:29:06 -06:00
ce8dddd9b7
Include note if attributes fail mid-diagnostics 2021-04-09 02:27:11 -06:00
812fd15011
Add more pylint cleanup fixes 2021-04-09 00:15:59 -06:00
2761018a37
Ensure /media is created in build_linux
Without this udevil will fail until it's created.
2021-04-09 00:06:22 -06:00
9d3508909a
Add DRIVE_POWEROFF_TIMEOUT to wk.cfg.ddrescue
This replaces a magic number
2021-04-08 23:40:00 -06:00
830e088ccf
Report if the dest starts failing during recovery 2021-04-08 23:17:00 -06:00
5a2d35d3cc
Prevent recovering to wrong devices or paths
Before starting a recovery run verify the source and destination have
not changed.  This will prevent issues on some extreme edge cases but
the main goal is for disappearing source drives with heavy damage.

e.g. A very damaged source drive disappears mid-recovery, drops off and
before would need a restart, or unplug/replug, to continue.  Now we can
attempt to re-detect the drive and resume recovery without leaving the
script.  If for some reason the drive order were to change then we'll
avoid using the wrong source or destination device.
2021-04-08 23:09:00 -06:00
43fd30322e
Expand checks for missing source or destination
Addresses issue #155
2021-04-08 22:43:13 -06:00
18bc139d25
Add 'Detect drives' option to ddrescue-tui 2021-04-08 20:55:28 -06:00
c452256fe7
Fix pylint issues in wk/hw/ddrescue.py 2021-04-08 20:49:21 -06:00
1a3b57da66
Poweroff source drives after ddrescue errors
Addresses issue #165
2021-04-08 19:41:05 -06:00
9eb782e2b7
Remove macOS override to default log path
Isn't needed since we're setting $HOME and including a symlink.
i.e. /var/root/Logs --> /Volumes/RAM_Disk/Logs
2021-04-06 17:06:48 -06:00
9478000cdf
Add Clock Sync option to HW-Diags menu under macOS 2021-04-06 16:57:31 -06:00
61f2b00a2a
Export SMC data in HW Diagnostics
Addresses issue #154
2021-04-06 15:53:19 -06:00
8e5d350ac2
Update default log dir under macOS 2021-04-06 15:52:57 -06:00
cce8651e00
Update launch-in-tmux to avoid some error messages
If tmux wasn't already running it would output an error but still work.
The new approach will suppress that since we're not concerned if it's
already running or not, just whether the desired session is.

Modified the live macOS args to support connecting to the HW-Diags
session remotely (more easily at least).
2021-04-05 16:46:01 -06:00
50e4164bf8
Apply bugfixes for macOS sections 2021-04-05 16:44:45 -06:00
ecbbf5511c
Set macOS localtime using main.cfg
Not sure where the old reference to an "other" timezone came from.
Going to use the POSIX style esp. after finding the answer below.
Thankfully both options appear in macOS 10.11-10.15 in my testing.
https://stackoverflow.com/a/4309852
2021-04-04 03:24:56 -06:00
695bf03bcb
Add fixes for High Sierra 2021-04-04 03:18:59 -06:00
b3e7b55635
Add fixes for El Capitan 2021-04-04 03:14:59 -06:00
aa6f7088ab
Copy networksetup to live macOS 2021-04-02 19:30:05 -06:00
cd2b5b997f
Fix wallpaper path in macOS Terminal.app 2021-04-02 18:43:34 -06:00
c8d473ba7d
Drop unused iTerm2 preferences 2021-04-02 18:41:31 -06:00
76f74b770b
Update macOS setup files 2021-04-02 18:34:13 -06:00
d2f9e9fd2f
Add option to have separate macOS wallpapers 2021-04-02 02:08:22 -06:00
0ebfbb51b1
Add macOS wallpaper 2021-04-01 23:06:48 -06:00
cdbc300ea2
Add SSH server to live macOS builds 2021-04-01 22:59:31 -06:00
7215c3242b
Connect to WiFi before starting HW Diagnostics 2021-04-01 22:58:56 -06:00
0aefdf3f1a
Add support to build live macOS Catalina images
* Had to drop iTerm due to a library incompatibilty
2021-04-01 22:54:36 -06:00
a36dd24ae9
Add install-deps script for macOS 2021-04-01 22:17:45 -06:00
21627180c3
Update wk-power-command to support macOS 2021-04-01 22:07:47 -06:00
c49391d05a
Update clock under live macOS env 2021-03-26 03:04:21 -06:00
5b4139e3c8
Add missing live-macos branch
This was not being pushed from a testing MacBook so I'm adding it all
at once. This is unfinished, still needs scripts to prep the working
macOS env from which the live env is built.

El Capitan code is likely to be dropped completely. Installing or
compiling dependencies in brew is problematic at this point.
2021-03-26 01:18:08 -06:00
ae42634a8e
Add SMART override for some Samsung devices
* Addresses issue #163
2021-03-26 00:57:08 -06:00
1a38a6d6a3
Remove stale code 2021-03-25 23:43:10 -06:00
1a70ad0c63
Generate iwd network profiles
* Addresses issue #162
2021-03-25 23:39:48 -06:00
ba5efedb11
Remove pylint bad-whitepace references 2021-03-25 21:25:40 -06:00
9818d5196f
Export state objects as pickle files
This should better ensure debugging an issue will have all the relevant
info at the ready.
2021-03-25 21:15:56 -06:00
3f48b10942
Apply "temp" fix for macOS HW-Diags 2021-03-25 21:11:21 -06:00
7fdab1b1e6
Fix typo 2021-03-25 15:14:37 -06:00
1f4a3c6e55
Avoid crash when parsing special mountpoints 2021-03-25 14:37:02 -06:00
876ac668c1
Use new refind package 2021-03-25 00:08:49 -06:00
4892f4c419
Update Linux theme 2021-03-24 23:47:25 -06:00
6b9e5cad9f
Update year in LICENSE.txt 2021-03-24 21:46:04 -06:00
635b54ff07
Merge branch 'refactor-archiso' into dev 2021-03-24 21:44:39 -06:00
2e5621bf6e
Add new rofi theme 2021-03-24 21:37:40 -06:00
1353de44f7
Merge refactored code
NOTE: This was unintentionally squashed so some details were lost

* Include max CPU temp in Conky
* New tint2 theme
2021-01-10 19:55:19 -07:00
118012d7e2
Merge refactored code
NOTE: This was unintentionally squashed so some details were lost

* Major updates to build_linux to support the current archiso scripts
* Most customize_airootfs.sh code has been moved elsewhere
  * Using static files or links where possible
  * Generating other files as needed in build_linux
* Syslinux configuration has been simplified
* Dropped i3
* Dropped rxvt-unicode in favor of termite
  * Font rendering broke one too many times
* Dropped NetworkManager in favor of iwd/systemd-networkd
2021-01-10 19:28:51 -07:00
b081d79fab
Change file layout for new archiso usage 2021-01-10 19:09:10 -07:00
2497fec389
Merge branch 'project-overhaul' into dev 2021-01-10 17:24:54 -07:00
31cd8d1e56
Fix items_not_found logic 2021-01-10 17:19:27 -07:00
ce912e9525
Update windows_builds.py to include 20H2 2021-01-09 21:15:07 -07:00
7d77aa81b0 Update sensors.py to improve CPU data
Include AMD CCD sensors
Exclude current sensors
2021-01-09 21:08:53 -07:00
830395f672 Update windows_builds.py to include 20H1 2021-01-09 21:07:45 -07:00
9a53d4adad
Updated log handling to support Windows 2020-04-26 16:28:23 -06:00
6c775bbba7
Adjusted running as root checks
* Suppress pylint errors when checking uid/euid/gid
  * Helpful when checking under Windows
* Allow running wk.exe.stop_process() under Windows
2020-04-26 16:24:35 -06:00
d0d74b8763
Support creating emtpy keys in reg_write_settings() 2020-04-07 23:23:11 -06:00
8753344665
Added reg_write_settings()
* Replaces old write_registry_settings()
* Uses tuples to combine all parts of the values
  * e.g. ('SampleValue', 'SampleData', 'SZ', '32)
  * This will allow merging multiple setting groups together
  * Should be more readable than the old method
2020-04-07 23:05:40 -06:00
818e321682
Added alias for ip
* Use brief reporting with colors
2020-04-06 19:46:36 -06:00
24dbdf29fd
Added Windows Registry functions 2020-04-06 19:46:09 -06:00
a4df2f41d3
Added wk.exe.stop_process()
* Replaced wk.hw.ddrescue.stop_ddrescue()
2020-02-25 20:52:08 -07:00
45a6b31910
Added periodic destination health check
* Addresses issue #158
2020-02-25 20:45:59 -07:00
94a428f6da
Added check for missing source/destination
* Addresses issue #155
2020-02-25 20:15:13 -07:00
0a00e17536
Avoid another rare crash when saving average temps 2020-02-17 16:54:51 -07:00
1f1fdfc738
Avoid rare crash when saving average temps 2020-02-17 16:44:33 -07:00
a354e67642
Merge branch 'project-overhaul' into dev 2020-02-03 18:11:07 -07:00
3b640ac85b
Addressed issue #153 2020-02-03 18:09:46 -07:00
e773a05265
Bumped year in LICENSE.txt 2020-02-03 17:25:44 -07:00
5ca0127e46
Merge branch 'project-overhaul' into dev 2020-01-30 20:05:32 -07:00
e301617ca0
Revert "Adjusted menus under live macOS"
This reverts commit 4a3981e10c.
2020-01-30 20:05:15 -07:00
6cee9930c1
Merge branch 'project-overhaul' into dev 2020-01-30 14:03:11 -07:00
a66c27be84
Updated get_disk_details_macos() 2020-01-30 14:01:30 -07:00
ebbdedef6c
Added get_fstype_macos() 2020-01-30 13:59:12 -07:00
ad1adba837
Add APFS and HFS/HFS+ to RECOMMENDED_MAP_FSTYPES 2020-01-30 13:51:23 -07:00
6eb75c38a3
Report if item(s) are missing during build-ufd 2020-01-30 13:48:51 -07:00
64db679a4d
Allow setting verbose value for TryAndPrint obj
* Instead of strictly per-call
2020-01-30 13:47:59 -07:00
154acc5280
Run build-ufd as current user
* sudo is used for elevated commands instead
* Avoids splitting logs between root and current user
* Addresses issue #150
2020-01-30 13:36:43 -07:00
06d1f0551b
Dropped oblogout usage in opembox menu 2020-01-30 13:31:34 -07:00
da4b50afb4
Merge branch 'project-overhaul' into dev 2020-01-30 13:30:16 -07:00
385b2158fd
Improved method to avoid crash during self-tests 2020-01-30 13:28:52 -07:00
dc6dcfb845
Revert "Avoid crash during SMART self-test"
This reverts commit cc8c0992f6.
2020-01-30 13:25:46 -07:00
c8f95d866a
Typo fix 2020-01-30 13:24:49 -07:00
86f0f1e5fd
Avoid rare crash concerning disk attributes
* Crash would occur under these circumstances:
  * Disk Attributes test was not selected
  * One or more other disk tests were selected
  * A non-blocking attribute error was detected
2020-01-30 13:16:48 -07:00
417241acb5
Fixed clearing the screen under live macOS 2020-01-30 13:09:57 -07:00
4a3981e10c
Adjusted menus under live macOS 2020-01-30 13:08:13 -07:00
c7d57ff266
Fixed logging under live macOS 2020-01-30 13:07:04 -07:00
e1943b9fb4
Strip sudo use if running as root on Linux/macOS
* Allows running under live macOS
2020-01-30 13:03:21 -07:00
41130a38ed
Fix running tmux in live macOS env 2020-01-30 13:02:41 -07:00
98032a0fed
Removed stale TODO statements 2020-01-28 19:00:47 -07:00
1a26aead44
Network test working under macOS 2020-01-28 18:38:33 -07:00
2b5e2244c1
Merge branch 'project-overhaul' into dev 2020-01-28 18:21:59 -07:00
f14f5e0d72
Adjusted logging 2020-01-28 18:21:24 -07:00
5cc0456f40
Improve performance under macOS by using rdisks 2020-01-28 18:12:53 -07:00
0c8701e3e4
Support get_disks_macOS() on older macOS versions 2020-01-28 18:10:10 -07:00
cc8c0992f6
Avoid crash during SMART self-test 2020-01-28 18:09:33 -07:00
fe50ce8994
Use new Mac fan sections in HW Diags 2020-01-28 18:08:26 -07:00
7fd3e3bada
Added Mac fan control sections 2020-01-28 18:04:21 -07:00
25d9f3d20d
Updated Mac sensor names 2020-01-28 18:00:29 -07:00
cb531fa14a
Merge branch 'project-overhaul' into dev 2020-01-24 12:28:12 -07:00
568483d49c
Updated config to use hexidecimal for sfdisk 2020-01-24 12:27:13 -07:00
145b7b76f9
Merge branch 'project-overhaul' into dev 2020-01-23 18:57:14 -07:00
9c95dcbd5c
Fixed CoreStorage scanning
* Dropped use of mktemp since sudo was interferrring
* Fixed crash if timeout occurred
2020-01-23 18:56:27 -07:00
25c532881e
Allow custom temp file suffixes 2020-01-23 18:56:11 -07:00
dc97fb079d
Merge branch 'project-overhaul' into dev 2020-01-23 14:12:04 -07:00
1b643f3918
Updated wk.kit.ufd
* Don't continue if a step fails, instead re-raise the exception
* Made the private functions public
2020-01-23 14:09:13 -07:00
019cbb6c1a
Updated TryAndPrint
* catch_all can now be set for a TryAndPrint instance
  * As opposed to defining for every TryAndPrint.run() call
2020-01-23 14:06:52 -07:00
8bcf9b032e
Merge branch 'project-overhaul' into dev 2020-01-22 23:17:12 -07:00
ea3240772e
Create mount_point before mounting source 2020-01-22 23:15:12 -07:00
b71d3479be
Updated wk.kit.ufd
* Moved TryAndPrint run_program calls to private functions
  * Only need PASS/FAIL and to hide the cmd output
* Avoid crash when searching for boot config files
* Misc Bugfixes
2020-01-22 23:11:24 -07:00
78e28bb6d2
Log wk.exe.run_program result in debug mode 2020-01-22 23:07:03 -07:00
0219f886ce
Merge branch 'project-overhaul' into dev 2020-01-22 20:59:40 -07:00
458f637d2c
Bugfix: typo 2020-01-22 20:59:24 -07:00
631c5e907f
Merge branch 'project-overhaul' into dev 2020-01-22 20:53:57 -07:00
aa1338e1b5
Don't edit main.py in build_linux
* All config files should be edited externally before building
2020-01-22 20:52:38 -07:00
e4cf588891
Fixed build_additions.txt usage 2020-01-22 20:45:40 -07:00
989ed25cf8
Merge branch 'project-overhaul' into dev 2020-01-22 15:37:59 -07:00
5cbb86abd8
Clear screen before starting diags 2020-01-22 15:37:26 -07:00
d3adc08c15
Merge branch 'project-overhaul' into dev 2020-01-22 11:26:26 -07:00
bfc17942cd
Added header to SMART self-test output
* Matches badblocks header
* Also added Initializing message
2020-01-22 11:22:47 -07:00
e92ceb070c
Adjusted I/O Benchmark screen layout 2020-01-22 11:21:49 -07:00
79abbcfaf8
Avoid crash when getting NVMe attributes 2020-01-22 11:20:39 -07:00
710fcc29dc
Catch non-blocking SMART errors between tests
* This doesn't block further tests, just ensures Disk Attributes fails
2020-01-20 18:31:29 -07:00
e59073cf20
Merge branch 'project-overhaul' into dev 2020-01-19 15:58:26 -07:00
661681b806
Fix permission issues when running GSMARTControl 2020-01-19 15:49:16 -07:00
3f9ebedfb3
Fixed Conky update script 2020-01-19 15:14:30 -07:00
1b473b1ab0
Fix pipes when run from hw-diags 2020-01-19 15:14:03 -07:00
202022c5a0
Added perl-rename to build dependencies 2020-01-19 14:28:03 -07:00
6373996c68
Merge branch 'project-overhaul' into dev 2020-01-19 14:14:01 -07:00
5e2361ba94
Reworked building Full and Minimal Linux versions
* Use a common build function and pass version to build
* Doesn't replace existing custom repo (if present)
* Addresses issue #149
2020-01-19 14:10:35 -07:00
4dce02308b
Forgot to remove statements 2020-01-17 15:31:20 -07:00
af80f53666
Merge branch 'project-overhaul' into dev 2020-01-16 20:33:21 -07:00
a01f3d04b6
Updated mount-all-volumes
* Added gui argument to open Thunar after mounting
2020-01-16 19:18:12 -07:00
45608e8346
Fixed shortcuts for hw-sensors 2020-01-16 19:00:56 -07:00
7f9cb9917d
Replaced oblogout with new wk-exit script
* Dropped oblogout due to Python2 dependencies
2020-01-16 18:57:27 -07:00
92cfe54f98
Added desktop shortcuts from dev branch 2020-01-16 18:54:19 -07:00
f16a01c6fb
Adjusted startup configuration
* picom replaced compton
* Fix conky config for i3 use in .update_x
* Improved detection of current WM in .start_desktop_apps and .update_conky
2020-01-16 17:56:49 -07:00
ac134b0a3f
Updated Conky configs
* Converted config to new Lua format
* Moved config to ~/.config/conky/
* .update_conky updated to work with above changes
* Dropped Disk and Network I/O sections
2020-01-16 17:18:16 -07:00
627c86ce7f
Removed unused .conky_start script 2020-01-16 15:16:15 -07:00
1451035560
Don't update conkyrc directly
* By using a temp file and comparing we can avoid excessive reloading of conky
2020-01-16 15:12:43 -07:00
6686a4d495
Set wallpaper in .update_x not .start_desktop_apps
* Setting a wallpaper isn't really starting a desktop app anyway
2020-01-16 14:57:31 -07:00
d0e69683b5
Changed Linux build path 2020-01-16 14:56:48 -07:00
d873013968
Explicitly request Python 3 2020-01-13 23:19:18 -07:00
23fb36cd8a
Added upload-logs script 2020-01-13 23:18:37 -07:00
c161ebac2a
Save ddrescue results to log at exit
* Instead of printing them since it should be run in tmux
  * And as such the results would be obscured from the user anyway
2020-01-13 22:11:07 -07:00
e9b1fe7819
Adjusted clone settings filename
* Use source path if the model wasn't detected
  * Avoids names like "Clone_.json"
2020-01-13 21:59:40 -07:00
f91df9f4e7
Fixed hw-diags and ddrescue-tui launchers (again) 2020-01-13 21:59:11 -07:00
bff3bbdc86
Added cdtmp alias 2020-01-13 21:58:49 -07:00
df2e4927d2
Made add-known-networks executable 2020-01-13 21:20:17 -07:00
0e602bb504
Replaced 'which' with 'command -v'
* Allows use under new Arch base package
2020-01-13 20:11:25 -07:00
6408b1abff
Fixed ROOT_DIR under new organization 2020-01-13 20:11:06 -07:00
cb0d411605
Merge branch 'project-overhaul' into dev 2020-01-13 18:24:32 -07:00
0a7fedd9c5
Fixed hw-diags and ddrescue-tui launchers 2020-01-13 18:23:17 -07:00
7b77946afe
Merge branch 'project-overhaul' into dev 2020-01-13 17:49:00 -07:00
28d9085231
Fixed getting filesystem UUID 2020-01-13 17:48:22 -07:00
6c374e9ae4
Merge branch 'project-overhaul' into dev 2020-01-13 17:25:03 -07:00
16dbffd91c
Enable SAT usage for USBs to expand SMART support
* Only enabled for USB devices
* Only enabled if attributes weren't found using --device=auto
* Addresses issue #109
2020-01-13 17:12:58 -07:00
e355fb1316
Use UUIDs instead of labels in build-ufd
* Addresses issue #138
2020-01-13 16:48:00 -07:00
24a2e60f02
Use two-space indentation everywhere 2020-01-13 16:24:56 -07:00
6c66473209
Added downstream updates to build_linux 2020-01-13 16:08:10 -07:00
d8617df871
Adjusted self-test results formatting 2020-01-13 15:45:07 -07:00
ea9a9f9a46
Pass Disk Attribute test for devices lacking SMART
* Since these can't fail I think passing them makes sense
2020-01-11 19:51:57 -07:00
c3da2557a6
Merge branch 'project-overhaul' into dev 2020-01-08 20:45:18 -07:00
ab2e9862e2
Remove Event Logs step from AIDA64 full report 2020-01-08 20:41:38 -07:00
ec3bbb83e9
Update for the new Archlinux base package 2020-01-08 20:40:34 -07:00
76a9d90ecb
Adjusted ddrescue TUI results report 2020-01-08 20:35:32 -07:00
6e3f02961c
Made load_settings() and save_settings() private
* Clears a pylint issue and makes sense to me
2020-01-08 19:50:04 -07:00
43cf4e2727
Added generate_report() to wk.hw.ddrescue.State() 2020-01-08 19:46:40 -07:00
9171ed6685
Revert SMART config used for testing 2020-01-08 19:09:55 -07:00
0a2976d9ce
Set pass/fail attributes in disk_attribute_check() 2020-01-08 19:02:09 -07:00
51224a6929
Added note to remove relative paths after testing 2020-01-08 17:02:57 -07:00
b101809e42
Merge branch 'project-overhaul' into dev
* Linux side is done
2020-01-08 15:47:07 -07:00
a7bb7e1e23
Updated .gitignore 2020-01-08 15:04:40 -07:00
da6f818d90
Updated build_linux for use under new organization 2020-01-08 14:59:54 -07:00
7702cdcf0a
Finished converting UFD sections, testing next 2020-01-07 23:53:55 -07:00
8b9672313a
Added ufd settings 2020-01-07 23:21:18 -07:00
142ad75744
Added remaining UFD functions 2020-01-07 21:58:04 -07:00
b0b0b612a1
Added Linux mount and unmount functions
* If not running with root priviledges then udevil is used.
2020-01-06 20:58:46 -07:00
c135d686df
Added Linux functions for building UFDs 2020-01-06 20:27:59 -07:00
8f31e5bd67
Added I/O functions for building UFDs 2020-01-06 20:26:57 -07:00
703783406a
Removed old mount-all-volumes script 2020-01-04 21:36:44 -07:00
7bf03749ec
Added CoreStorage scanning logic
* Still needs tested
2020-01-04 21:35:42 -07:00
b75326aeee
Added indent option to wk.std.print_report() 2020-01-04 21:04:24 -07:00
945ae941fa
Added mount-all-volumes sections
* Still need to add the CoreStorage logic
2020-01-04 21:01:41 -07:00
fdad48f613
Fixed wk.std.color_string() 2020-01-04 21:00:36 -07:00
72787d5c24
Fix destination checks when imaging 2020-01-04 18:42:55 -07:00
b79deefdd6
Fix map name when using loopback devices 2020-01-04 18:28:43 -07:00
168c0a50df
Removed old ddrescue-tui launcher 2020-01-04 18:18:39 -07:00
383b7c331a
Safety wheels are off 2020-01-04 18:07:28 -07:00
64645cdf1f
Expanded logging (slightly) 2020-01-04 18:06:57 -07:00
5926c3170d
Reworked retry sections
* Edit the map file directly instead of using --retrim and --try-again
  * Allows for more accurate pass status reporting
  * Allows for simpler pass break/continue logic
* Create the map file before running ddrescue
  * Allows file to be edited by the current user instead of just root/ddrescue
* Added check for empty map files
  * Avoids incorrectly marking a pass as complete
2020-01-04 18:01:39 -07:00
470524dfff
Added pause after "No actions performed" message 2020-01-04 16:54:28 -07:00
4acdab8c0f
Mark passes Skipped as appropriate 2020-01-04 16:53:56 -07:00
c71e30e4fb
Adjusted debug reports 2020-01-04 15:58:43 -07:00
a68e52322c
Fixed aborting when multiple parts selected 2020-01-04 15:41:15 -07:00
e6e51498dd
Clear ddrescue pane every minute 2020-01-03 18:36:53 -07:00
30a5df8a00
Fix timezone in SMART pane 2020-01-03 18:36:40 -07:00
4a2b18e4f7
Added confirmation to Quit if recovery < 100% 2020-01-03 17:55:23 -07:00
848ccc3ef1
Made several State() functions "private" 2020-01-03 17:54:55 -07:00
097360ca0a
Always ask GPT/MBR/Source when formatting a disk
* This fixes cloning partitions when not creating a boot partiton
2020-01-03 17:32:51 -07:00
6eaf5c2bc2
Get accurate size from ddrescuelog
* Reported size is off by one sector in some cases
2020-01-03 17:25:12 -07:00
eb702577ae
Mark clones as started to allow resuming 2020-01-03 16:45:47 -07:00
276e2e0dda
Made mode a State() variable 2020-01-03 16:38:48 -07:00
a4b5e81ef1
Made working_dir a State() variable 2020-01-03 16:08:38 -07:00
4f2b31c705
Avoid crash while stopping ddrescue
* Killall is needed because of sudo
2020-01-03 01:14:06 -07:00
2b18da7244
Added real ddrescue command logic
* Still needs testing!!
* Set all dry_run keywords to default to True
2020-01-03 00:47:33 -07:00
c22c3da493
Expanded safety checks
* Added destination NVMe/SMART checks
2020-01-02 23:33:21 -07:00
2983eb9bd3
Updated run_ddrescue()
* Added SMART pane logic
2020-01-02 23:24:23 -07:00
299b075eef
Fixed BlockPair().safety_check() 2020-01-02 22:32:18 -07:00
48eb4c13d7
Better handle non-iterables in color_string() 2020-01-02 21:57:40 -07:00
9ae8810282
Added real disk format section
* --dry-run=True safety wheels still engaged
2020-01-02 21:22:47 -07:00
ac04a3ddc5
Added another safety check for block pairs
* Needed one more check since clone pairs were assumed to be okay
2020-01-02 21:14:25 -07:00
5d0ed475a6
Added option to match source partition table type 2020-01-02 20:07:46 -07:00
9702d7665f
Added limited support for converting MBR/GPT types 2020-01-02 19:54:18 -07:00
6dc887b04e
Added initial disk formatting sections 2020-01-02 15:50:26 -07:00
764d35836b
Force running all passes if retry selected 2020-01-01 15:06:16 -07:00
1dacdd4637
Abort if an invalid image destination selected 2020-01-01 15:02:23 -07:00
f45a10395f
Added --force-local-map option 2020-01-01 15:02:11 -07:00
df6f3ba8e1
Added initial ddrescue pass logic 2019-12-30 20:21:37 -07:00
e88e4ab3eb
Added ddrescue settings sections 2019-12-30 19:29:32 -07:00
bcd46d4017
Added SMART/Journal panes 2019-12-30 19:25:46 -07:00
d9561a0159
pylint cleanup 2019-12-30 18:47:35 -07:00
e7fbc21721
Added EToC logic 2019-12-30 17:43:15 -07:00
0ddafe8a42
Updated side pane sections 2019-12-30 16:40:28 -07:00
631449e40a
Added format_status_string() 2019-12-30 16:40:03 -07:00
89de1d52bb
Updated BlockPair __init__() and pass_complete() 2019-12-30 16:37:49 -07:00
6ad68c37d4
Added update_progress_pane()
* Still a WIP
2019-12-29 19:29:09 -07:00
fa39801523
Adjusted block pair report 2019-12-26 20:18:17 -07:00
7d7dc70630
Added map data loading sections 2019-12-26 20:16:35 -07:00
fc0a37999b
Added size safety check to ddrescue TUI 2019-12-26 19:27:08 -07:00
bd3601e0c8
Ask for ticket ID and use in working_dir 2019-12-26 17:35:58 -07:00
20787da275
Optionally disallow empty responses to input_text 2019-12-26 17:19:26 -07:00
c083a124ad
Adjusted wk.std.input_text() again
* Dropped tcflush usage for simplicity
* Readded the prompt usage from 564745f03b
2019-12-26 17:00:41 -07:00
20ffa0c6db
Added --start-fresh argument 2019-12-24 18:01:04 -07:00
ef6abce6ab
Skip source partition selection if using JSON data 2019-12-24 17:35:38 -07:00
f542b62f3c
Use source model name in clone settings save file 2019-12-24 16:44:26 -07:00
4c50a1fb8a
Added first run flag to clone settings
* If the loaded settings are for a non-attempted recovery discard settings
2019-12-24 16:43:07 -07:00
67bb9223aa
Moved block pair report to new function 2019-12-24 16:42:18 -07:00
e7e3261b0a
Fixed partition separators 2019-12-24 16:38:42 -07:00
44b6c4eedb
Disable network servers by default 2019-12-22 21:24:55 -07:00
f71cc8ad68
Expanded block pair sections and confirmations 2019-12-22 21:24:02 -07:00
1ed6309971
Include selected source parts in 1st confirmation 2019-12-22 19:05:32 -07:00
6d6380dc6a
Added clone load/save and add block pair sections 2019-12-22 18:49:07 -07:00
0f2007f5dc
Set working directory for ddrescue TUI
* If cloning use backup server share
* If imaging use destination directory
* If a preferred directory and fstype can't be used then warn the user
2019-12-22 16:14:03 -07:00
428d255538
Added selection confirmation sections 2019-12-21 16:53:55 -07:00
0f0c47bbe4
Force selecting at least one partition/device 2019-12-20 12:54:42 -07:00
59ef06f402
Added select_path() 2019-12-19 11:59:34 -07:00
2fb2c3fa6e
Adjusted loopback device descriptions 2019-12-19 11:31:32 -07:00
b20e6cc4ad
Mount passed filepath as raw image
* Also unmount atexit
2019-12-18 20:47:06 -07:00
c3245c92da
Handle passing dir/file paths to ddrescue-tui 2019-12-18 19:28:52 -07:00
3fc9a843fc
Added select_disk_parts()
* Differentiate between all parts selected and whole disk selected
2019-12-13 20:04:15 -07:00
c72372d55c
Replaced platform.system() with PLATFORM var
* Better?
2019-12-13 19:01:26 -07:00
bc2c3a2c80
Expanded source/dest disk selection sections 2019-12-13 18:37:36 -07:00
cb7d0da816
Drop pause in launch-in-tmux 2019-12-13 18:36:56 -07:00
6bfee95043
Support coloring pathlib.Path objects 2019-12-13 16:38:24 -07:00
da5f521f92
Added wk.hw.ddrescue.select_disk() 2019-12-12 19:29:32 -07:00
b746cda6e7
Bugfix 2019-12-12 18:46:44 -07:00
3733da17fc
Moved get_disks() from wk/hw/diags to wk/hw/obj 2019-12-12 18:36:57 -07:00
48a6b3200b
Added init_recovery()
* Set mode
* Select/verify source/dest
2019-12-12 17:22:02 -07:00
3a8c052d5a
Updated ddrescue menu sections
* Support loading presets
2019-12-12 16:43:23 -07:00
045d2b2571
Updates ddrescue-tui tmux sections 2019-12-12 16:39:42 -07:00
5445df8e62
Added settings_select() to Menu()
* Supports ddrescue-tui style toggle/change usage
2019-12-12 15:52:09 -07:00
7a880e2ee7
Added initial ddrescue sections
* Very early outline, very broken still
2019-12-10 15:56:12 -07:00
15f1a5bada
Removed old mount-backup-shares wrapper 2019-12-09 20:56:17 -07:00
d0eee81129
Added unmount-backup-shares wrapper 2019-12-09 20:54:53 -07:00
07cb287eb0
Updated wk.net.connected_to_private_network()
* Can either return True/False or return None/raise Exception
* Added network check to mount_backup_shares()
2019-12-09 20:53:42 -07:00
3262888024
Added unmount network share sections 2019-12-09 20:50:17 -07:00
77190137f6
Added mount-backup-shares wrapper 2019-12-09 20:10:57 -07:00
82827b7a0d
Avoid crash under macOS 2019-12-09 19:57:47 -07:00
0472166c09
Added share mount check logic 2019-12-09 19:42:02 -07:00
9c7914fc3d
Added mount_backup_shares & mount_network_share 2019-12-09 19:23:44 -07:00
2770f85e01
Moved server definitions to wk/cfg/net.py 2019-12-09 17:50:36 -07:00
b25b15f195
Set PYTHONPATH 2019-12-09 17:32:40 -07:00
442ed991bb
Remove shebang and exec mod from hw-diags.py 2019-12-09 17:12:42 -07:00
ca001ed831
Restrict hw-drive-info and hw-info to Linux 2019-12-09 17:11:54 -07:00
e623185d96
Removed old HW script wrappers 2019-12-09 17:09:56 -07:00
8e5bfa12f4
Added NVMe SMART status checks
* Addresses issue #130
2019-12-09 16:48:35 -07:00
23c99084b5
Drop SIGWINCH sections 2019-12-09 16:48:15 -07:00
cc85e3e8ed
Improve abort handling 2019-12-09 16:32:35 -07:00
081658550b
Added debug report sections
* HW-Diags debug reports are saved after showing results or atexit
2019-12-09 15:55:30 -07:00
6bc4ce3c0b
Add Maximum value for power on hours 2019-12-09 14:29:28 -07:00
82341dbbb3
Moved disk safety checks to after the test
* This way failures during the last test should be caught
2019-12-08 17:02:10 -07:00
6071470b6a
Add note to disk report for critical HW error(s) 2019-12-08 16:52:20 -07:00
376a9e92ba
Supress a couple pylint warnings 2019-12-08 16:42:34 -07:00
9dc8329dec
Updated self-test sections
* Improved abort handling
* Always include report if state.tests['Disk Self-Test'] is enabled
* Send abort command via smartctl if aborting self-test(s)
2019-12-08 16:37:37 -07:00
c09cd0c9c2
Added disk safety check before each test
* Includes possible workaround for SMART self-test TimedOut errors
2019-12-08 15:29:18 -07:00
7d66b723ca
Update test report on ERROR 2019-12-06 19:34:53 -07:00
126aaae8ba
Fix IO_RATE_REGEX under macOS 2019-12-06 19:31:32 -07:00
8f909182d3
Bugfix: typo and batch catch 2019-12-06 19:21:24 -07:00
1f74b0b989
Use "RAW" disks under macOS 2019-12-06 19:18:40 -07:00
a0b07cbfde
Added I/O Benchmark sections 2019-12-06 19:10:36 -07:00
c7585d17f0
Added graph functions 2019-12-06 15:02:06 -07:00
2c732885c6
Revert "Adjusted wk.std.input_text()"
This reverts commit 564745f03b.
2019-12-06 13:21:36 -07:00
2a4b68c222
Fixed tail usage under macOS 2019-12-06 13:19:47 -07:00
a76d7775fd
Updated badblocks sections
* Increaded pane height to 5
* Updated pass/fail/unknown logic
* Reduced lines included in reports
2019-12-06 13:02:57 -07:00
b45dc74e5a
Start logging after updating log path 2019-12-06 13:01:31 -07:00
564745f03b
Adjusted wk.std.input_text()
* Should hopefully reduce the duplicate prompts
2019-12-06 13:00:34 -07:00
56a99a8a4e
Avoid crash if tmux pane closes while getting size 2019-12-06 12:25:48 -07:00
e1ef9db6b6
Color disk labels in badblocks panes 2019-12-05 23:02:08 -07:00
d173d317e3
Updated badblocks section
* Start tests in reverse order (so they appear in order on screen)
* Fixed report parsing
2019-12-05 22:57:13 -07:00
76772be422
Added badblocks sections
* Supports running in parallel
* Dropped NonBlockingStreamReader usage
2019-12-05 22:20:26 -07:00
6167d0d78d
Get disk serial numbers under macOS 2019-12-05 14:24:57 -07:00
da7c12bb61
Don't use dummy test objects when no disks avail 2019-12-05 14:20:17 -07:00
fb4b44fefb
Fixed temps pane under macOS 2019-12-03 18:16:33 -07:00
65c08ad972
Updated disk_self_test()
* Parallel self-tests!
2019-12-03 17:36:52 -07:00
b71bca4577
Updated disk_attribute_check() 2019-12-03 16:31:26 -07:00
445523e5f1
Fix aborting Prime95 test 2019-12-03 15:18:10 -07:00
6da34c1f2b
Only register tmux atexit when running HW Diags
* Prevents unintended killing of tmux panes when importing wk or wk.hw
2019-12-03 15:03:02 -07:00
c0b6606758
Stop Prime95 with INT signal instead of TERM 2019-12-03 14:47:57 -07:00
d1005ad0a9
Updated sensor name formatting 2019-12-02 22:47:09 -07:00
e041125c20
Added hw-sensors 2019-12-02 21:02:12 -07:00
4dc41aec27
Bugfix: mprime typos 2019-12-02 20:31:33 -07:00
4990537082
Handle critical temps correctly in mprime sections
* Moved ThermalLimitReachedError catches to wk.hw.sensors
  * Before they would never be caught and would never stop the script
* Added cpu_reached_critical_temp() to wk.hw.sensors
  * This allows us to check if it happened without exceptions
* Added thermal_action to wk.hw.sensors
  * This is run when ThermalLimitReachedError(s) are caught
* Stop print_countdown if mprime is terminated
  * This is required since it may be killed in the background
2019-12-02 20:11:02 -07:00
c520b5a865
Update for Python 3.8 pylint alerts 2019-12-02 17:55:05 -07:00
7796189d14
Clear screen before all diag functions 2019-12-02 17:54:48 -07:00
aa3b69f6fa
Added progress pane logic 2019-11-30 22:43:10 -07:00
4cadb913e8
Dropped bufsize=1 due to Python 3.8 warning 2019-11-30 21:29:24 -07:00
79371a3fa5
Added results screen to hw-diags 2019-11-14 20:43:44 -07:00
402c4359a1
Split Prime95 and cooling Test() objects 2019-11-14 20:16:15 -07:00
fec2473b93
Fixed Prime95 test length 2019-11-14 19:16:10 -07:00
45086c90bb
Prime95 test fully functional 2019-11-14 19:13:21 -07:00
1a91f72d8c
Running and stopping Prime95 working 2019-11-13 19:45:53 -07:00
46a6dda0ff
Prime95 workflow mostly done 2019-11-13 17:47:52 -07:00
0eadb784bb
Updated get_ram_list_linux() 2019-11-13 11:14:55 -07:00
e18b625281
Updated ClassicStartSkin source URL 2019-11-13 11:08:30 -07:00
aa5b5cd9b7
Selecting and running (dummy) tests now working 2019-11-12 21:10:11 -07:00
d4ca575426
Fix get_disks_macos() 2019-11-12 20:06:18 -07:00
1054794af3
Added get_disks()
* This calls either get_disks_linux() or get_disks_macos()
2019-11-12 19:56:39 -07:00
4e6b2cd4da
Started work on per-pass log handling in hw-diags 2019-11-12 17:32:55 -07:00
9b5d9e1186
Added watch-mac and reverted previous commit
* This allows the degree symbol to be displayed correctly
  * (At least in iTerm2)
2019-11-12 10:36:34 -07:00
4bd4536cfd
Avoid using the unicode degree symbol under macOS
* The (home)brew watch command butchers the unicode?
2019-11-11 23:57:48 -07:00
e3d0902c45
Updated wk.hw.sensors
* Added monitor_to_file()
* Added save_average_temps()
2019-11-11 23:22:47 -07:00
4ecdc80e4c
Added sensor update sections 2019-11-11 22:18:09 -07:00
b15c01ac37
Fixed sensor sections under macOS 2019-11-11 21:47:55 -07:00
dc030ab076
Added initial version of wk.hw.sensors
* Supports Linux and macOS
  * Only initial temp, no updates yet
2019-11-11 21:29:21 -07:00
49c0ce9a62
Support layouts with multiple panes of same type 2019-11-11 17:29:58 -07:00
72905f9ccc
Added CLI options to hw-diags 2019-11-10 21:05:41 -07:00
ee7d656f2a
Delete log atexit if empty 2019-11-10 20:47:59 -07:00
21dfeac20b
Expanded logging in wk.hw.diags 2019-11-10 20:22:48 -07:00
906826d752
Updated TryAndPrint()
* Don't log function name unless in debug mode
* Log msg_good instead of UNKNOWN for non-failed functions with no output
* Avoid issue if function returns int
2019-11-10 20:21:15 -07:00
196e2adc82
Added tmux layout maintenance sections
* Support both threading and signal based calls
  * Should provide a smoother UIX under Linux & macOS
2019-11-10 19:10:35 -07:00
0cbc858cf4
Intentionally crash if not running inside tmux 2019-11-10 18:05:06 -07:00
6963d2ae71
Fix echo usage under macOS 2019-11-10 18:01:07 -07:00
0b6cd1cb6c
Added secret menu options in hw-diags 2019-11-10 17:42:04 -07:00
964885d63c
Ensure tmux panes are closed atexit for hw-diags 2019-11-10 17:38:03 -07:00
76a501af85
Added State() and tmux sections to wk/hw/diags 2019-11-10 17:04:45 -07:00
2520126905
Use broader imports for wk/hw/diags.py 2019-11-10 16:22:04 -07:00
fe228a5edc
Added keyboard_test() 2019-11-10 15:17:00 -07:00
100757ba69
Added network_test() 2019-11-10 14:47:56 -07:00
ce3a98028a
Fixed wk.std.show_data() alignment 2019-11-10 14:29:55 -07:00
2b06375f71
Removed unused hw-diags and hw-diags-audio scripts 2019-11-09 19:35:23 -07:00
8f663072f6
Added HW-Diags audio test, menu, and launcher 2019-11-09 19:25:30 -07:00
05d6fb762c
Added wk/tmux.py 2019-11-09 17:29:31 -07:00
177401ecc8
Small formatting adjustment 2019-11-09 17:28:43 -07:00
920f481049
Adjusted DEBUG log date format 2019-11-09 14:25:22 -07:00
27b75ab8e9
Added README.md with pylint config info 2019-11-08 16:01:58 -07:00
205c5ed0fc
Support model-specifc attribute thresholds
* Addresses issue #142
2019-11-08 16:00:27 -07:00
3a2924bd51
Added print_report() 2019-11-08 14:08:16 -07:00
b7c790438a
Updated launch-in-tmux
* Don't exit shells, just the function
* Don't leave dangling tmux sessions if possible
* Restore original session/window name if using an active tmux session
2019-11-08 13:50:26 -07:00
a053931c17
Added Test() object 2019-11-07 20:46:21 -07:00
b162c99d6e
Added BaseObj() class 2019-11-07 20:40:50 -07:00
12de0e5b84
Inlcude RAM vendor ID for unknown IDs 2019-11-07 18:58:20 -07:00
0e9b1af56b
Added safety check to Disk().get_details() 2019-11-07 18:57:31 -07:00
d933ff9742
Reordered functions 2019-11-01 18:52:26 -06:00
e634d1691f
Added SMART self-test sections 2019-11-01 18:51:02 -06:00
93102b5144
Reworked checking Disk() attributes
* Added separate Disk().check_attributes() function
  * Can be used to check all KNOWN_ATTRIBUTES or just blocking ones
* Renamed ATTRIBUTES to KNOWN_ATTRIBUTES for clarity
  * Renamed 'Critical' column to 'Blocking'
* Added '(Failed)' note to attribute report
  * Addresses issue #131
2019-10-31 19:19:52 -06:00
07fdbcdd7c
Added Disk().safety_checks()
* Raises an exception for blocking events
* Removed "Ignore" column from ATTRIBUTES
  * Listed attributes should either be warnings or errors
  * Only 'Critical' attributes should block futher tests
2019-10-31 18:28:34 -06:00
d25b341eb3
Added is_4k_aligned_macos() 2019-10-31 16:48:30 -06:00
5d6b7578d3
Fixed 4K alignment check under Linux 2019-10-31 16:34:54 -06:00
2a019d09a0
Updated Disk notes sections 2019-10-31 16:33:35 -06:00
117df6158a
Fix attribute value colors 2019-10-28 20:57:34 -06:00
ae5e9b8f34
Added 4K alignment check 2019-10-28 20:45:30 -06:00
c7090e77c2
Added Disk().generate_report()
* Uses new merged ATTRIBUTES config
2019-10-28 20:15:58 -06:00
fbb480dae6
Adjusted drive details
* Use 'bus' instead of 'proto(col)' or 'tran'
  * I think it's a better description
* Reordered details alphanumerically
* Removed 'log-sec' from required details
  * Only concerned with the phy-sec
2019-10-28 17:55:37 -06:00
6a1be5cf06
Moved wk.obj to wk.hw.obj
* Done because the main classes are CpuRam() and Disk()
  * The rest are there for uniformity while working with HW objects
2019-10-28 17:46:17 -06:00
c0242ad55c
Added macOS support for disk details and SMART 2019-10-25 19:13:04 -06:00
70248ef0b5
Added macOS support for CpuRam() object. 2019-10-23 20:33:41 -07:00
07120b7dc4
Fixed Disk() description and SMART data 2019-10-23 16:28:55 -07:00
52d61226a0
Added Disk() obj 2019-10-23 15:23:50 -07:00
6e557da370
Added CpuRAM() object. 2019-10-22 18:49:44 -07:00
c9b3794f0e
Renamed some vars for consistency 2019-10-22 18:43:04 -07:00
2b5254dd0c
Bugfix check_disk.py
* Now passes pylint
2019-10-21 18:57:53 -07:00
3ecf107c39
Adjusted print_colored() kwargs 2019-10-21 18:57:31 -07:00
193511d83b
Added color_string(), blink "colors", and more
* The list of strings are now joined using ' ' by default
  * Instead of ''
* Added YELLOW_BLINK and RED_BLINK escape codes
* print_colored() now optionally logs the msg
2019-10-21 18:51:32 -07:00
89f62562f0
Removed reference sections from wk.prev 2019-10-02 22:58:24 -07:00
187a29ff6f
Bugfix speedtest() 2019-10-02 22:44:36 -07:00
cc483abd29
Added ping()
Added ping()
Added ping()
Added ping()
Added ping()
Added ping()
Added ping()
Added ping()
Added ping()
2019-10-02 22:31:54 -07:00
386299ce57
Added network functions 2019-10-02 22:26:10 -07:00
e80a63ee51
Added show_data() 2019-10-02 22:25:54 -07:00
a2017fa415
Added check_disk.py 2019-10-02 21:40:56 -07:00
ad06fab8a2
Updated log path options
* Adjusted default log path
* Support Windows Kit/Tool/General log paths
2019-10-02 21:34:07 -07:00
1ffabd8642
Updated wk.os.win 2019-09-23 00:01:54 -07:00
4c35d7cb4e
Added CHKDSK functions 2019-09-22 23:34:02 -07:00
ff1044a401
Fixed logic error in non_clobber_path()
* Before the '_1000' path would be returned incorrectly
  * If a non-existant path wasn't found that is
2019-09-22 23:31:15 -07:00
60969f26eb
Reworked setting log paths
* Added DEFAULT_LOG_DIR and DEFAULT_LOG_NAME vars
  * Allows easier reuse of default values
* Added format_log_path()
  * Uses default path/name unless dir/name specified
* Added get_root_logger_path()
  * Returns the first fileHandler path found (if any)
* update_log_path() now supports multiple handler scenarios
2019-09-22 23:27:41 -07:00
2ea0b4818a
Updated run_sfc_scan()
* Output is UTF-16, decode it as such
  * Simplifies section
* Reworked checking the result
  * Use separate exceptions for corruption and general errors
2019-09-22 21:50:08 -07:00
972cb6fb66
Breaking updates to TryAndPrint()
* Removed print_return argument
  * Instead if the function returns data assume it should be printed
* Added ability to override msg_good for a single run() call
2019-09-22 21:27:28 -07:00
9ee664bc2b
Dropping CBS fix sections 2019-09-22 21:26:48 -07:00
1cfd8fb7b4
Added outer activation script 2019-09-22 20:06:40 -07:00
f27f3024e8
Added get_json_from_command() 2019-09-18 22:37:18 -07:00
115a462f6e
Added Windows activation functions 2019-09-18 22:27:38 -07:00
0636a032be
Added threading functions 2019-09-18 21:51:39 -07:00
27d348bf9c
Expanded debug log 2019-09-18 21:36:39 -07:00
f1775766e7
Updated wk.log.update_log_path()
* The log file is now moved instead of copied
* The new path can now be based on a new dir, name, or both
2019-09-18 20:58:06 -07:00
318f59c473
Added logging to print functions 2019-09-18 20:23:13 -07:00
5925aca3c2
Allow strings to be passed to print_colored() 2019-09-18 20:02:39 -07:00
f55f0ba016
Adjusted logging in TryAndPrint() 2019-09-18 20:02:13 -07:00
304d811698
Moved exe functions to a separate file 2019-09-18 18:49:56 -07:00
2678ce77da
Added SFC scan 2019-09-15 19:34:06 -07:00
b41027562a
Added SafeMode enter/exit sections 2019-09-15 18:47:52 -07:00
78e3765730
Added delete_item() 2019-09-15 17:29:10 -07:00
010ac87de6
Added delete_empty_folders() and delete_folder() 2019-09-15 16:50:06 -07:00
7a99713043
Added non_clobbering_path() 2019-09-15 16:28:47 -07:00
6af5f78fbb
Dropping wk/exe.py
* All intended functionality now in std.py
2019-09-15 15:34:27 -07:00
8ca59a029a
Added popen_program() 2019-09-15 15:32:34 -07:00
40413151c8
Added run_program() 2019-09-15 15:10:13 -07:00
6f60006c9a
Added get, kill, and wait process functions 2019-09-15 14:35:32 -07:00
b71f1d8d80
Reordered functions 2019-09-15 13:33:59 -07:00
8c8eea0f9a
Adjusted pylint settings 2019-09-13 22:48:33 -07:00
7cb5ecd09f
Added TryAndPrint() class
* Replaces try_and_print() function
* Moved several functions to TryAndPrint() class
  * _format_exception_message()
  * _format_function_output()
  * _get_exception()
* Separates the formatting settings and the function paramters
2019-09-13 22:35:39 -07:00
8d9e264efc
Fix menu checkmark under macOS 2019-09-13 21:02:56 -07:00
3d95d9c1a1
Fixed clear_screen() under Windows 2019-09-13 20:47:27 -07:00
4d6fad82db
Adjusted menu index formatting
* Right-align numbered and action text
2019-09-13 20:29:18 -07:00
94dac676fe
Updated formatting 2019-09-13 20:29:05 -07:00
a59f20ac8b
Support optional extra separators in Menu() 2019-09-13 19:44:56 -07:00
428bb5a05c
Updated advanced_select() 2019-09-13 18:45:07 -07:00
21b44d01ff
Added avanced_select() to Menu()
* Renamed 'Enabled' to 'Selected' for clarity
2019-09-13 18:41:47 -07:00
9da19f3702
Added support for hidden menu entries 2019-09-13 17:49:44 -07:00
f1a1a158ba
Added simple_select() to wk.std.Menu()
* Allows user to select one entry from available entries
2019-09-13 16:16:33 -07:00
68000272ea
Improved clear_screen()
* Now uses subprocess.run() instead of os.system()
* Avoids weird clear -> print issues
  * i.e. Missing newlines, etc
2019-09-13 16:14:36 -07:00
e52e90454d
Fix seperator length 2019-09-07 15:44:38 -06:00
d7fc209e53
Added some doctests 2019-09-07 15:17:54 -06:00
849c53a62d
Include try_and_print result in log 2019-08-22 17:29:50 -06:00
2b08654d7c
Fixed _get_separator_length()
* Use title line(s) and 'Display Name' instead of name
  * Menu()._update() is required to be run previously
2019-08-20 22:34:38 -06:00
1542ba39cd
Fixed _get_valid_answers()
* Correctly omits disabled items
2019-08-20 22:12:09 -06:00
34d5106804
Added _get_valid_answers() to Menu() 2019-08-20 22:05:20 -06:00
1f96ae5c53
Renamed _show() to _generate_menu_text()
* It returns a string instead of printing the text
2019-08-20 22:04:42 -06:00
bd3440daa9
Updated Menu()
* Added logic for disabled items
* Use 'Display Name' in _show()
2019-08-20 21:49:42 -06:00
8cedac738e
Added _get_display_name() and _update() to Menu()
* _update()
  * Calls _get_display_name()
  * Used to update the state of the menu
  * Will add set logic to this method later
2019-08-20 21:18:47 -06:00
7a9c569251
Separating public and private methods 2019-08-20 21:15:59 -06:00
0707d650f6
Started work on the new Menu() object
* This will replace the old menu_select() function
* This will contain all toggle/set/selection logic
  * Which would allow for simpler usage in other sections/scripts/etc
2019-08-20 20:32:37 -06:00
516dc88d44
Removed improper NotImplementedError usage 2019-08-20 19:21:44 -06:00
c43539a92d
Switching to f-strings where appropriate 2019-08-20 16:00:08 -06:00
b314a9f1e2
Bugfix updates for try_and_print() 2019-08-09 21:57:41 -06:00
4100c38280
Added generic exception classes 2019-08-09 20:34:05 -06:00
d722754f12
Replaced UserWarnings with proper exceptions 2019-08-09 20:10:13 -06:00
147b9d2035
Added format_exception_message() 2019-08-09 19:50:45 -06:00
4e5bef23da
Added format_function_output() 2019-08-09 19:06:06 -06:00
ff4e371b32
Added get_exception() and try_and_print()
* try_and_print needs the format_..() functions finished before it can be used
* Raised minimum Python version to 3.7
  * Probably could go with 3.6 but meh
2019-08-09 19:00:01 -06:00
36e2ad8522
Updated cfg/main
* Added INDENT and WIDTH
2019-08-09 17:17:46 -06:00
11d9a5203e
Adjusted docstrings 2019-08-09 16:42:00 -06:00
cf5b546183
Compress report before uploading
* It's the new default but it can be disabled
2019-08-07 19:27:49 -06:00
2270236e42
major_exception() working 2019-08-07 19:25:02 -06:00
f75feca345
get_log_filepath() is working under all platforms 2019-08-06 21:52:11 -06:00
bde8d33f20
Include logging data in debug report if available 2019-08-06 21:51:43 -06:00
5d40d74c46
Include sys.argv in debug report 2019-08-06 21:10:13 -06:00
2f720210e9
Added generate_debug_report() 2019-08-06 20:56:03 -06:00
a0027122c9
Added set_title()
* Only Windows is supported ATM
2019-08-06 19:49:30 -06:00
a60e298f02
Updated bytes_to_string() 2019-08-06 19:29:40 -06:00
d9a1cb755b
Forgot the i3 exit shortcut 2019-08-03 19:11:22 -06:00
a7dac6072c
Added alt shortcuts for those listed in conky
* These use CTRL+ALT instead of SUPER
  * This allows for easier usage over VNC
2019-08-03 18:58:51 -06:00
0757b9fe55
Added get_log_filepath()
* Much safer method than what was in upload_debug_report()
2019-07-25 22:03:15 -06:00
f1d53e698b
Added major_exception() 2019-07-25 21:34:22 -06:00
1829c3b2f3
Moved CRASH_SERVER to wk.cfg.main 2019-07-25 21:33:19 -06:00
1997cdcefd
Reordered log.py functions 2019-07-17 21:37:03 -06:00
4cb52a28a6
Removing useless print_standard()
* No longer needed with the separation of printing and logging
2019-07-17 21:35:27 -06:00
5c817717e7
Added upload_debug_report()
* Partial replacement for major_exception()
  * Splitting that function into smaller parts
2019-07-17 21:34:14 -06:00
77238ad41a
Catch log.start() UserWarning
* May revert this down the road
2019-07-17 21:32:02 -06:00
c9d35a0e2f
Adjusted update_log_path()
* Should result in more uniform log names
2019-07-17 21:31:25 -06:00
6e963fe5da
Added wk/cfg/net.py 2019-07-17 21:30:20 -06:00
04ca9b9fff
Added bytes_to_string()
* Renamed from human_readable_size() for clarity
* Now supports KB vs KiB
* Now supports negative values
* Removed width logic as that should be handled elsewhere
* Removed auto conversion to bytes if passed a string
* An exception will now be raised if an invalid size is given
2019-07-17 19:22:02 -06:00
2cbe99952f
Updated string_to_binary()
* Raise an exception if the string can't be parsed as a valid size
* Handle strings without spaces (e.g. '1.44mb')
* Handle negative values
2019-07-17 18:38:56 -06:00
f985c03490
Added string_to_bytes()
* Renamed from convert_to_bytes() for clarity
* Now supports KB vs KiB
2019-07-17 18:28:05 -06:00
7a0a618b3f
Reordered functions in wk.std 2019-07-17 18:02:42 -06:00
1ffbd29ed5
Added choice() 2019-07-17 17:56:23 -06:00
b60f357527
Added abort() 2019-07-17 17:55:38 -06:00
6e43340acb
Adjusted debug logging 2019-07-17 17:55:20 -06:00
b0aa7b0218
Added beep() 2019-07-16 17:53:20 -06:00
86d9979a7f
Added sleep() 2019-07-16 17:53:14 -06:00
ac7fcb2e0b
Added clear_screen() 2019-07-16 17:52:21 -06:00
9da283f7fc
Adjusted print functions
* Logging is now always done at the DEBUG level
2019-07-16 16:42:28 -06:00
6928485965
Added print functions
* Uses new method for printing in color (no global var usage)
2019-07-13 19:01:57 -06:00
bdf53b435a
Added placeholder files for submodules 2019-07-13 17:45:39 -06:00
36e70c48ba
Adjuested log_path under Windows 2019-07-13 17:42:44 -06:00
f30a6dd3db
Typo fix 2019-07-13 17:29:30 -06:00
8b4daa507b
Use different default log_path under Windows 2019-07-13 17:23:35 -06:00
b98397d491
Include seconds in default log name 2019-07-08 17:32:17 -06:00
ca67ed392f
Avoid clobbering existing files 2019-07-08 16:56:03 -06:00
23eda17bd3
Ensure logging is shutdown when exiting 2019-07-08 16:55:39 -06:00
acd92b3e50
Added logging functions
* Logging is always initialized if importing the whole package
* Support switching to DEBUG mode
* Support changing the log dir (and optionally log name)
2019-07-07 22:09:22 -06:00
4cc54011b7
Added version check 2019-07-07 22:02:48 -06:00
beabbd9c7b
Bugfix 2019-07-02 20:52:28 -06:00
dfde06a2fd
Updated __init__ files 2019-06-29 21:33:47 -06:00
f7a114ee44
Added cfg/logging.py and cfg/main.py 2019-06-29 21:23:37 -06:00
0427d2586f
Added ask and pause functions 2019-06-29 20:52:38 -06:00
96837ff774
Going to use the logging module for logging 2019-06-29 19:58:44 -06:00
bca9c19053
New safer text input function
* Avoids EOFError exceptions and just repeats the prompt
2019-06-29 19:54:02 -06:00
b368b27faa
New project organization
* Script work is brought into better focus
* New layout will be used to better package the python scripts
* No hidden folders (they will be hidden at build time)
* All building should be done under setup/
  * Avoids ambiguous .bin/.cbin folders at root of project
2019-06-28 18:06:43 -06:00
91d8185ede
Updated startup scripts
* Moved starting apps from .update_x into .start_desktop_apps
  * This allowed .update_x to be shown on screen during startup
* Included "<Action>... Done" messages for clarity
* Removed x_ok logic (didn't really work)
  * Replaced with a generic message that _should_ be left on screen if X fails
2019-06-27 20:14:14 -06:00
18daa41e2a
Trimmed down motd 2019-06-27 20:13:09 -06:00
747277b121
Adjusted Super+t keyboard shortcut
* Now it opens to a standard urxvt window (no tmux attaching)
2019-06-27 20:11:02 -06:00
b8e09e83ce
Fixed issue #124 2019-06-27 18:57:45 -06:00
e798503f6f
Save RAM details to CpuObj 2019-06-12 16:37:04 -06:00
5b5c99e6f8
Don't kill current tmux session from ddrescue-tui
* Just kill the panes and let launch-in-tmux handle the session
2019-06-12 15:48:11 -06:00
c50627867e
Switch to prev tmux from hw-diags & ddrescue-tui
* Only during normal exits, not done for aborts/crashes
2019-06-12 15:37:19 -06:00
e30e52e880
New launch-in-tmux script
* Generic run cmd in tmux wrapper
* ddrescue-tui and hw-diags source this script to run their respective menus
  * Reduces duplicate code
2019-06-12 15:31:30 -06:00
90f5285067
Updated tmux menu launchers
* Use current TMUX session if present
* Can switch TMUX session without nesting
* Fixes issue #114
2019-06-12 14:58:27 -06:00
441a6ad66f
Prevent ddrescue-tui crash when LogDir is missing
* Fixes issue #115
2019-06-12 14:05:45 -06:00
87668c6ad0
Avoid rare crash when uploading results for review
* Fixes issue #117
2019-06-11 20:52:45 -06:00
d1af82e114
Restore default UAC in System Setup
* Fixed mode names
* Fixes issue #119
2019-06-11 20:42:33 -06:00
dba39dd9c4
Don't use MS formats in LibreOffice by default 2019-06-11 20:32:30 -06:00
eb3624e9ad
Integrated downstream updates
* Fixes issue #113
2019-06-11 18:55:23 -06:00
b95586a590
Moved to a unified system setup script
* Replaces:
  * Install SW Bundle
  * New System Setup
  * User Checklist
  * System Checklist
2019-06-11 18:42:31 -06:00
3007c22c41
Added Windows Update sections 2019-06-11 18:40:25 -06:00
f30d195cc4
Updated Explorer registry entries 2019-06-11 18:08:50 -06:00
c537a01fbf
Updated info.py 2019-06-11 17:55:50 -06:00
86f17757db
Updated cleanup sections 2019-06-11 17:49:10 -06:00
70823d2cd8
Updated HW-Diags and sensor sections 2019-06-04 20:53:34 -06:00
ec5591453e
Updated data.py 2019-06-04 20:16:09 -06:00
606efac3fe
Updated mounting sections 2019-06-04 20:09:56 -06:00
28bedc0873
Run ddrescue-tui as current user 2019-06-04 20:01:26 -06:00
52e4415b43
Updated ddrescue sections 2019-06-04 20:00:11 -06:00
248e321438
Updated windows_builds 2019-06-04 19:16:25 -06:00
c4ad9055d4
Launch Explorer windows in separate process 2019-06-04 19:14:36 -06:00
7a67e68308
Updated install_sw_bundle 2019-06-04 19:07:37 -06:00
434bb97765
Updated sw_diags.py 2019-06-04 19:01:21 -06:00
6a821de0b5
Added LibreOffice settings 2019-06-04 18:58:24 -06:00
576cb29281
Updated settings.setup.py 2019-06-04 18:57:07 -06:00
b83f2b0c5f
Updated pause() 2019-06-04 18:48:03 -06:00
2d3ccac369
Updated convert_to_bytes and human_readable_size 2019-06-04 18:46:35 -06:00
7816602685
4K Alignment checks 2019-06-04 18:40:42 -06:00
214df52723
Expanded SW bundle sections 2019-06-04 18:33:57 -06:00
35890d6bb3
Fixed setting timezone in Windows 2019-06-04 18:29:32 -06:00
7ccd4c6055
BITWISE operators =/= LOGICAL operators 2019-06-04 18:24:01 -06:00
5ccd628259
Updated check_disk.py 2019-06-04 17:10:38 -06:00
b9276aa0d7
Updated build-ufd 2019-06-04 17:09:59 -06:00
798876eb10
Updated UFD sections 2019-06-04 17:06:11 -06:00
617bb1484a
Name connections by SSID 2019-06-04 16:54:40 -06:00
d51538aac3
Fixed handling of known_networks 2019-06-04 16:52:17 -06:00
b554cfebe0
Update tmux config to work with v2.9 2019-05-08 19:38:48 -06:00
f8773e1736
Add known networks when building the Linux ISO
* Instead of at login
2019-05-05 12:53:07 -06:00
d8024be2c3
Add option to upload hw-diag results for review 2019-04-25 20:55:14 -07:00
dac20b12f1
Hide .bin and .cbin in build-ufd
* Fixes issue #107
2019-04-25 19:09:27 -07:00
5ae8ea3be1
Show more details for loopback devices
* Fixes issue #106
2019-04-25 19:05:44 -07:00
1d2d79eceb
Updated Rofi config
* Set font to Noto Sans
* Added HiDPI support
  * Fixes issue #105
2019-04-25 18:50:07 -07:00
896f9e4a05
Explicitly define smartctl tolerance levels
* Fixes issue #104
2019-04-25 18:37:17 -07:00
b737696f7f
Show more accurate data in mount-all-volumes()
* Fixes issue #108
2019-04-25 18:13:53 -07:00
2fb9b36959
Minor formatting change 2019-04-21 21:41:02 -07:00
5756d14292
Fix issue #102 2019-04-19 19:16:25 -07:00
2ce8c66fc8
Merge branch 'new-ufd-script' into dev 2019-04-19 19:03:29 -07:00
9502ea0bbc
Deleted old build-ufd (BASH) 2019-04-19 19:02:38 -07:00
8b4b0c40ce
Merge branch 'new-ufd-script' into dev 2019-04-19 19:01:56 -07:00
a83dcdd06a
Handle non-ISO source items 2019-04-19 18:14:10 -07:00
731a281805
More bugfixes 2019-04-19 16:33:12 -07:00
e2d788e265
Fixed upate_boot_entries() 2019-04-19 15:23:21 -07:00
0080539575
Copy the known_networks file to /root/ 2019-04-19 14:36:09 -07:00
19799bb1f4
Adjusting formatting 2019-04-18 20:52:47 -07:00
72c0e75156
Fix mounting UFD 2019-04-18 20:52:11 -07:00
27eb7975ef
Fixed SYSLINUX installation 2019-04-18 20:51:14 -07:00
b05057d743
Ignore errors when uncommenting boot entries
* Allows using older ISOs which lack newer boot entries
  * Not a great idea, but it won't crash
2019-04-18 20:00:37 -07:00
8edf164522
Avoid crash present in archiso v40-1
* Fix is present in upstream archiso-git
* iwd would be installed as a dependency for NetworkManager anyway
2019-04-18 19:29:40 -07:00
f062f3ce71
Fixed source ITEMS 2019-04-18 19:28:15 -07:00
153cda7cf8
Fixed update_boot_entries() 2019-04-18 19:27:41 -07:00
050bef7f85
Skip FileNotFoundError in copy_source()
* Avoids crash when copying some WinPE ISOs
2019-04-18 19:26:28 -07:00
e07c019fb2
Bugfix: Call unmount() not mount() 2019-04-18 19:25:13 -07:00
21a587ee0f
Bugfix sleep() 2019-04-18 19:24:39 -07:00
427243c933
Reordered functions 2019-04-16 00:33:47 -07:00
cd4ea75862
Remove the arch dir when updating the UFD 2019-04-16 00:23:58 -07:00
949efa4de6
Added hide items sections 2019-04-16 00:16:05 -07:00
a9461311bc
Unmount UFD before installing Syslinux 2019-04-16 00:15:33 -07:00
4215a2fd78
Added find_first_partition() 2019-04-16 00:14:46 -07:00
9652aa4623
Added install Syslinux section 2019-04-15 23:57:46 -07:00
091c31d33a
Bugfix 2019-04-15 23:52:06 -07:00
89ac824d82
Expanded boot entries sections
* Update Arch labels from ISO_LABEL to UFD_LABEL
* Added Linux (Minimal) to syslinux
* Added Linux (Minimal) and Linux (dGPU) entries to rEFInd
* Removed Linux (i3) entries
  * I guess this is a hidden feature now...
2019-04-15 23:44:42 -07:00
4115f3cfe1
Removed unused args 2019-04-15 23:16:57 -07:00
c66b2facbf
Skip confirm_selections if --force is used 2019-04-15 23:12:27 -07:00
c16e97e49a
Added boot entry sections 2019-04-15 23:07:33 -07:00
95f4877862
Reordered functions 2019-04-15 23:04:37 -07:00
fc9de61269
Added copy_source() 2019-04-15 22:40:20 -07:00
26aca0df9f
Added mount and unmount sections 2019-04-15 22:38:54 -07:00
7ee04060d8
Added dGPU to BOOT_ENTRIES 2019-04-15 22:37:58 -07:00
d769b1ad4e
Set overwrite=False by default 2019-04-15 22:05:48 -07:00
996b01bb34
Add Linux dGPU items 2019-04-15 21:30:44 -07:00
807c94e2ce
Add argument for Linux (dGPU) 2019-04-15 21:29:10 -07:00
af757c5582
Show full device paths 2019-04-15 21:28:53 -07:00
c8944e5a14
Fixed prep_device() 2019-04-15 21:27:27 -07:00
2230ea1eea
Added prep_device()
* Skipped if --update is used
2019-04-15 20:30:39 -07:00
e098d40c2f
Added pylint exceptions 2019-04-14 18:49:32 -07:00
72cc33cb7e
Only show destination device, not all devices 2019-04-14 18:48:54 -07:00
3310e3d253
Moved most logic to functions.ufd 2019-04-14 18:43:08 -07:00
164fd4c646
Fixed SystemExit calls from docopt 2019-04-14 18:09:36 -07:00
0e6be3ad08
Better SystemExit handling 2019-04-14 17:57:46 -07:00
1b312658e9
Fixed return code handling 2019-04-14 17:17:11 -07:00
cf1d11eb78
Always show header 2019-04-14 17:16:13 -07:00
cc1a318e3d
Abort if not running as root 2019-04-14 17:03:04 -07:00
6734460d42
Added option to skip pause in abort()
* Also use exit_script(1)
2019-04-14 17:01:53 -07:00
fde9be6b3f
Updated get_user_name() 2019-04-14 16:48:34 -07:00
d62a647fa9
Avoid setting LogDir to /root/Logs under su/sudo 2019-04-14 16:46:50 -07:00
5a1f7b1829
Silence build-ufd init 2019-04-14 15:58:09 -07:00
b2528b90f8
Fix docopt handling
* Show usage if invalid arguments are used
2019-04-11 22:25:13 -07:00
0883b099fd
Skip safety check if upgrading 2019-04-11 22:24:25 -07:00
23add7e276
Preserve DPI settings when updating conky 2019-04-11 21:40:51 -07:00
56ca605257
Regularly update conky config
* This should allow USB adapters to be shown if connected after login
2019-04-11 21:30:53 -07:00
c3ebdee5d0
Only update hostname when necessary
* If $IP was empty then HOSTNAME would remain set to the current HOSTNAME
  * This allowed the redundant set-hostname call
2019-04-11 21:14:32 -07:00
d113d710a7
Avoid dig errors if not connected to a network 2019-04-11 21:00:32 -07:00
c4755124a0
Remove more connect-to-network sections 2019-04-11 20:59:42 -07:00
ceb6a9e294
Use setup-wifi instead of connect-to-network 2019-04-11 20:57:30 -07:00
a8afd793e0
Added setup-wifi script
* This will replace the connect_to_network() function
2019-04-11 20:55:40 -07:00
d33f78960d
Reduced imports 2019-04-11 20:50:21 -07:00
1a8b6705e0
Show selections before starting work 2019-04-08 20:57:35 -07:00
415f56863d
Finished recursive_copy() 2019-04-08 20:26:41 -07:00
4d9ab2215b
Ensure SMART values are shown for some disks
* smartctl can return non-zero if there are errors in the SMART logs
2019-04-08 18:57:38 -07:00
14ebc23b81
Fix issue #101 2019-04-08 17:39:43 -07:00
b43309be75
Avoid rare crash when scanning CoreStorage volumes 2019-04-08 15:55:52 -07:00
8cdb834499
Initial, incomplete version of recursive_copy() 2019-04-08 02:59:03 -07:00
5fe37b62b2
Adjusted source/dest items 2019-04-08 02:58:07 -07:00
4c33c110b7
Fixed source validation 2019-04-08 00:35:53 -07:00
b166172d10
Only perform case-insensitive search if needed 2019-04-07 23:45:08 -07:00
e420074c83
Use correct errors in find_path()
* FileNotFoundError is accurate since we're just looking for a path
2019-04-07 23:35:00 -07:00
50cb765108
Merged find_source_item() and get_full_path()
* Also fixed regex match (it wasn't matching the whole string)
2019-04-07 23:26:22 -07:00
b6c6fc9aa9
Find paths case-insensitively 2019-04-07 22:44:15 -07:00
cd0a9456cb
Use pathlib.Path to resolve paths
* is_block_device() is no longer needed
  * (pathlib.Path provides that functionality)
2019-04-07 22:41:41 -07:00
c4d00a2073
Fix typos 2019-04-07 22:35:09 -07:00
575126eaa2
Split build-ufd file to match other scripts 2019-04-07 20:51:54 -07:00
3ff0bcd3c9
Updated new_system_setup.py to match other scripts
* i.e. don't change dir when setting sys.path
2019-04-07 19:07:31 -07:00
639a338cca
Initial Python layout
* Going to use docopt for argument handling
* Script will be run as user using sudo where needed
* Tentatively dropping tmux usage
2019-04-07 19:03:56 -07:00
a22e6f552f
Start build-ufd rewrite in python 2019-04-07 19:01:03 -07:00
e089dd99a3
Avoid crash when no disks are connected
* It was attempting to recheck the NVMe/SMART data for the fake N/A lines
2019-04-02 16:29:09 -07:00
52e3e24a3a
Updated build-ufd 2019-03-30 09:48:48 -07:00
c5364a65a2
Avoid copying the wrong files from WinPE
* if w_en_us was empty it would copy the contents from $(pwd)
2019-03-30 09:45:36 -07:00
0b31fa271d
Expand build-ufd log 2019-03-30 09:38:13 -07:00
c022d3f9c6
Set ddrescue-tui EToC refresh rate in settings 2019-03-20 15:48:01 -06:00
28cea9697e
Moved ddrescue-tui EToC code to its own function
* Limited refresh rate to every 5 seconds
2019-03-20 15:45:27 -06:00
fa05c93bf8
Added EToC line to ddrescue-tui side-pane
* Is not shown in main menu
2019-03-20 15:21:19 -06:00
c96ffc5f59
Added overall status line to ddrescue-tui 2019-03-20 13:16:09 -06:00
95338f1df7
Add encoding to run_program and popen_program 2019-03-20 12:57:56 -06:00
877db91cb6
Extended Windows build list 2019-03-19 20:45:37 -06:00
723f1ad4ad
Fixed WizTree extraction 2019-03-19 14:16:39 -06:00
089cdba4f9
Updated sources 2019-03-19 14:16:16 -06:00
f98c106080
Bugfix: Extremely minor formatting issue 2019-03-17 21:30:25 -06:00
48c0cf0b1b
Adjusted Explorer settings 2019-03-17 20:43:19 -06:00
4cb14c6429
Restart Explorer after configuring
* Allows changes to be seen without restarting manually
2019-03-17 20:23:25 -06:00
b84d4eb6b8
Bugfix: typo 2019-03-17 20:22:50 -06:00
1235269da0
Bugfix 2019-03-17 20:17:00 -06:00
2e679dbf5e
Download stand alone Windows update installers
* Fixes issue #91 (again)
2019-03-17 18:11:36 -06:00
84deb49beb
Explicitly set colors to properly reset errorlevel 2019-03-16 23:03:13 -06:00
ec74b06282
Verify Python can be run before launching script
* Fixes issue #91
2019-03-16 23:02:44 -06:00
f9b35b9a3d
Fixed dict collision
* Fixes issue #97
2019-03-16 18:14:31 -06:00
c5b4446133
Configure Windows Updates during checklist/setup
* Sets readiness branch to non-targeted semi-annual
* Defers feature upgrades for 60 days
* Fixes issue #93
2019-03-16 18:11:19 -06:00
86f81f2720
Prevent updating OVERRIDE to CS 2019-03-16 15:11:42 -06:00
70b8d2536a
Missed a functions/json.py import 2019-03-13 20:39:47 -06:00
34ef0bfae6
Fail test on SMART self-test timeout 2019-03-13 20:22:28 -06:00
648787913e
Fixed issues importing settings files 2019-03-13 19:02:35 -06:00
75df9777b3
Removed extraneous whitespace 2019-03-12 22:49:25 -06:00
122bbfb157
Added debug mode for HW Diagnostics
* Uses alternative major exception
  * Saves State, CpuObj, and DiskObj data after traceback
  * Uploads the whole LogDir folder (compressed) instead of just the main log
2019-03-12 21:24:06 -06:00
7381547b27
Added functions.json
* Uses safer method to get JSON data from a command
* Replaced nearly all uses of json.loads with new get_json_from_command()
* Fixes issue #100
2019-03-12 16:08:21 -06:00
480222c1f2
Adjusted variable name usage for consistency 2019-03-12 15:13:16 -06:00
3fa6521c51
Only enable WinPE boot entries if necessary
* Addresses issue #94
2019-03-11 22:31:56 -06:00
459f95394a
Allow building UFD with only the Linux ISO
* Addresses issue #94
2019-03-11 22:27:07 -06:00
22b1452168
Find WinPE sources case-insensitively
* Allows non-WK WinPE builds to be used
* Addresses issue #94
2019-03-11 22:24:11 -06:00
1d10503b91
Support disks over 4TB in badblocks test
* Set read block size to 4KB if disk is 4Kn or 3TB+
* Fixes issue #99
2019-03-11 21:00:26 -06:00
e7d31c21c3
Get disk size in bytes during object creation
* Also moved dd calc section into docstring
2019-03-11 20:55:24 -06:00
7f6509d235
Return to HW-Diags menu from safety_check() 2019-03-11 13:26:11 -06:00
7701418e55
Recheck disk attributes after all tests
* Should catch errors exposed by badblocks
* Addresses issue #96
2019-03-11 13:25:12 -06:00
7078efe9e7
Adjusted SMART self-test running message 2019-03-11 13:23:56 -06:00
a3d2de92bc
Show CS/NS in quick mode if self-test is running
* It still shows the slightly ambiguous message "all tests disabled"
* Addresses issue #96
2019-03-11 12:37:01 -06:00
607d4b1e57
Skip SMART self-test in quick mode
* Addresses issue #96
2019-03-11 12:36:33 -06:00
6edfcc9766
Moved SMART self-test code to its own function
* Allows for a simpler run_nvme_smart_tests()
* Self-test is now done before the attribute check
* Addresses issue #96
2019-03-11 11:57:29 -06:00
40f269aabd
More cleanup for generate_attribute_report() 2019-03-11 10:52:11 -06:00
a5852d1caa
Major overhaul of NVMe/SMART reporting/testing
* Moved all errors/warnings to new nvme_smart_notes var
  * Allows the notes to be appended to the attribute report much easier
  * Allows the attribute report to be updated without losing notes
* NVMe/SMART should only contains the SMART short self-test results
  * If available and requested
* Updated safety_check to fix erroneous requests
  * Disable tests logic reworked
* Updated generate_disk_report() to include notes
* Addresses issue #96
2019-03-09 21:42:28 -07:00
95aa063a69
Adjusted disk safety checks
* check_attributes() is now always silent
  * Returns a PASS/FAIL bool
  * override_disabled is now at the Disk() scope
* Moved self-test checks to check_smart_self_test()
  * Returns a PASS/FAIL bool
* Addressed issue #96
2019-03-09 18:07:04 -07:00
e60bfaca48
Show better errors while building Linux
* Addresses issue #58
2019-03-09 14:27:23 -07:00
858c2e1bd5
Avoid crash on some Macs
* Partially addresses issue #88
  * HW damage should be avoided by using the THERMAL_LIMIT setting
2019-03-09 14:15:42 -07:00
b0e2b01e00
Added beep function
* Fixes issue #89
2019-03-09 14:11:53 -07:00
d5dc453ffa
Added maximum threshold for NVMe/SMART attributes
* Fixes issue #95
2019-03-05 19:36:43 -07:00
68a3b6d0c7
Fixed REGEX sections in settings files 2019-03-05 19:36:42 -07:00
197a5a9160
Misc cleanup 2019-03-05 19:36:42 -07:00
62f2ec8a4d
Moved SW-Diags settings to separate file 2019-03-05 19:36:42 -07:00
4197fc9e0b
Moved WinPE settings to separate file 2019-03-05 19:36:42 -07:00
8d8399c9aa
Moved windows setup settings to separate file 2019-03-05 19:36:42 -07:00
af5281626b
Moved setup settings to separate file 2019-03-05 19:36:42 -07:00
8add6f634c
Moved sensor settings to separate file 2019-03-05 19:36:41 -07:00
058a52961d
Moved info settings to separate file 2019-03-05 19:36:41 -07:00
d03772666d
Moved ddrescue-tui settings to separate file 2019-03-05 19:36:41 -07:00
974e20df05
Moved data settings to separate file 2019-03-05 19:36:41 -07:00
34f4bca97d
Moved browser settings to separate file 2019-03-05 19:36:41 -07:00
e2c83aad6e
Moves HW-Diags settings to separate file 2019-03-05 19:36:41 -07:00
cd4bb7c867
Create launcher for new_system_setup.py 2019-03-05 16:34:13 -07:00
0398ea7e51
Disable Tips & Tricks (more) 2019-02-27 23:57:13 -07:00
fa2aa04b53
Forgot dependencies for ldmtool 2019-02-05 23:02:23 -07:00
27eb984e73
Add ldmtool to read MS dynamic volumes
Fixes issue #92
2019-02-05 22:24:48 -07:00
017c0e3385
Avoid marking aborted badblocks test as failed 2019-02-05 21:49:00 -07:00
82377bc1ab
Stop Prime95 if CoreTemps hit 95*C
Fixes issue #90
2019-02-05 21:34:47 -07:00
7132d971f6
Add temp limit to report 2019-02-05 21:26:27 -07:00
dc6de9cab0
Use consistent labels 2019-02-05 21:25:28 -07:00
a28a754be1
Added thermal limit logic to Prime95 test 2019-02-05 21:08:06 -07:00
3c35a75c92
Raise exception when temps >= limit 2019-02-05 21:06:40 -07:00
f8404f3c16
Raise exception if temps above given threshold 2019-02-05 20:31:16 -07:00
5efdf05274
Adjusted VIM settings 2019-01-15 19:06:56 -07:00
7c7d8e41e2
Prevent crash when testing some NVMe disks 2019-01-15 18:56:29 -07:00
814ada0ac0
Updated HWiNFO url 2019-01-13 17:59:06 -07:00
fcd8d67f51
Bumped year in LICENSE.txt 2019-01-13 14:52:31 -07:00
5b9e91f8af
Updated Killer Network drivers source 2019-01-13 14:51:53 -07:00
bece9837b2
Moved Office 2019 installers to their own folder 2019-01-11 14:42:18 -07:00
6c47650c2d
Updated IOBit Uninstaller 2019-01-11 14:18:01 -07:00
fd8358a899
Fix ODT path 2019-01-11 14:17:41 -07:00
cb072366e0
Bugfix Office sections
* Addresses issue #86
2019-01-11 13:25:33 -07:00
4a96736592
Removed network installers 2019-01-11 13:17:25 -07:00
ad1d7d71f2
Fixed ODT sections
* Fixes issue #86
2019-01-11 12:59:12 -07:00
6246393894
Fixed update_fastcopy() 2019-01-11 12:31:08 -07:00
c1324548ce
Track ninite processes directly 2019-01-09 20:59:21 -07:00
969011f3f5
Added new_system_setup() 2019-01-09 20:55:48 -07:00
6488101cdc
Dumb workaround for Dell sensors 2019-01-09 16:29:18 -07:00
e088ba134e
Tool version bumps 2019-01-08 23:48:50 -07:00
f2bd2a6e75
Adjusted global_vars report 2019-01-08 20:33:23 -07:00
6ea4791dc9
Added generate_global_vars_report()
* Makes crash reports more readable
2019-01-08 20:24:43 -07:00
63f9c1c193
Fixed set_log_file() under Linux 2019-01-08 20:24:14 -07:00
ed70d1ab18
Simplified tmux repair thread handling
* Just start once and let run until script is exited
* Pretty sure this fixed the 100%+ CPU usage after returning to the menu
2019-01-08 19:18:00 -07:00
f8adbe074d
Added Linux headers for macbook12-spi-driver-dkms
* Addresses issue #67
2019-01-07 16:17:37 -07:00
4bd0cd1598
Avoid crash when no sensor data available
* This was broken when fixing issue #85
2019-01-07 15:29:33 -07:00
beb36dfc97
Adjusted window name 2019-01-07 12:54:28 -07:00
ebcd38ef50
Don't change directory during initialization
* Fixes issue with ddrescue-tui
2019-01-07 12:53:23 -07:00
ae92eea76e
Added macbook12-spi-driver-dkms to Minimal build 2019-01-06 22:43:33 -07:00
50da682d76
Fix issue #85 2019-01-06 22:12:01 -07:00
7a9474a6a8
Try enabling SMART before checking attributes
* Fixes issue #84
2019-01-06 21:51:45 -07:00
68bbee66d5
Replaced hw-diags-badblocks with threaded section
* Should fix issue #83
2019-01-06 21:45:01 -07:00
e40b0b98e4
Moved fix_tmux_panes() into a background thread 2019-01-06 20:57:06 -07:00
4a04e92caf
Added threading.py
* Will be used by hw_diags.py and ddrescue.py for
  * Better control over badblocks
  * Background the tmux pane fixes
2019-01-05 15:54:05 -07:00
aa4c6a1434
Fix issue #82 2019-01-02 18:04:32 -07:00
3d69fe773d
Removed sensors section from hw-info
* Fixes issue #81
2019-01-02 18:02:24 -07:00
141fe422db
Fix NVMe attribute handling
* Addresses issue #78
2019-01-02 17:55:56 -07:00
3122a75f64
Skip fan RPMs
* Avoids reporting fan RPMs as 6000+ *C
2019-01-02 17:31:19 -07:00
6340bceb11
Added warning if no disks detected. 2019-01-02 17:05:08 -07:00
a9c5c1c274
Fixed issue #80 2018-12-28 17:46:02 -07:00
8f9bae9a6f
Added option to build Linux with minimal packages
* All non-minimal packages/configs have been separated from the base setup
* `"Build Linux" -b` will only build the full version
2018-12-28 16:51:15 -07:00
575fa17425
Only use Unicode checkmark if in X 2018-12-28 15:44:14 -07:00
91649f5ee7
Removed args from run_program
* It's been deprecated for ages
* Fixes issue #79
2018-12-27 23:43:35 -07:00
1095e15643
More PEP8 updates 2018-12-27 22:52:50 -07:00
453ce9cf44
More fixes for main.py 2018-12-27 22:48:20 -07:00
b6e9e447c5
Fixed main.py 2018-12-27 22:45:49 -07:00
6df88ec021
Updated settings files 2018-12-27 22:42:42 -07:00
f321dee54f
Switched indents to 2 spaces 2018-12-27 22:28:17 -07:00
3e733e65e9
Updated network.py 2018-12-27 22:17:23 -07:00
7b8b1ab111
Updated files to meet PEP8 guidelines
* Fixes issue #42
  * More work is likely needed
2018-12-27 21:46:04 -07:00
922d632afb
Removed trailing whitespace 2018-12-27 21:44:46 -07:00
5af0996259
Removed whitespace on empty lines 2018-12-27 21:42:00 -07:00
c96e2f252c
Cleaned up imports 2018-12-27 21:38:25 -07:00
d0c49240d8
Added extra line break after classes/functions/etc
* Also reordered some class/regex/static sections
2018-12-27 21:33:37 -07:00
3b4668e61b
Adjusted init section 2018-12-27 21:02:04 -07:00
c7706a115f
Updated hw-diags-network 2018-12-27 20:58:37 -07:00
b1786e088c
Updated hw-diags-audio 2018-12-27 20:58:26 -07:00
c501c8b23f
Updated docstrings longer than 72 characters 2018-12-27 20:51:56 -07:00
387062074a
Updated msword-search 2018-12-27 20:30:40 -07:00
4ddce7cfbe
Updated mount-backup-shares 2018-12-27 20:28:26 -07:00
a9ebeee748
Updated mount-all-volumes 2018-12-27 20:28:14 -07:00
25bacb9892
Updated ddrescue-tui-menu 2018-12-27 20:27:55 -07:00
5664765f6e
Updated connect-to-network 2018-12-27 20:27:44 -07:00
c3ca58879c
Updated winpe_menus.py 2018-12-27 20:15:02 -07:00
ec0341027e
Updated windows_setup.py 2018-12-27 20:14:29 -07:00
fa424a4576
Updated update.py 2018-12-27 20:13:32 -07:00
a47707447c
Updated setup.py 2018-12-27 20:10:49 -07:00
cfd4eebcd4
Updated safemode.py 2018-12-27 20:09:26 -07:00
deb9d9add1
Updated repairs.py 2018-12-27 20:08:56 -07:00
82a2d6b74d
Updated product_keys.py 2018-12-27 20:07:18 -07:00
72eac47524
Updated disk.py 2018-12-27 20:05:53 -07:00
07e43307c5
Moved partiton_uids.py to settings 2018-12-27 20:04:29 -07:00
018aba2fe6
Updated network.py 2018-12-27 19:58:06 -07:00
097fae866a
Updated info.py 2018-12-27 19:57:39 -07:00
166a293864
Updated hw_diags.py 2018-12-27 19:55:41 -07:00
ffd07e07fd
Renamed diags.py to sw_diags.py
* Avoid confusion with hw_diags.py
2018-12-27 19:53:58 -07:00
0a899539c9
Updated diags.py 2018-12-27 19:52:18 -07:00
10e978d4c5
Updated ddrescue.py 2018-12-27 19:50:51 -07:00
4049272cbb
Updated data.py 2018-12-27 19:48:32 -07:00
c74e2c7667
Updated common.py 2018-12-27 19:43:37 -07:00
327c5b8a33
Updated cleanup.py 2018-12-27 19:43:25 -07:00
6a3e225192
Updated browsers.py 2018-12-27 19:43:12 -07:00
a269859b17
Updated backup.py 2018-12-27 19:42:58 -07:00
36e419bca0
Updated activation.py 2018-12-27 19:42:28 -07:00
765673db66
Updated windows_builds.py 2018-12-27 18:06:59 -07:00
28e2ce90df
Removed nvme-cli in favor of smartctl 2018-12-27 18:03:16 -07:00
a124236def
Removed unused pydf config 2018-12-27 18:01:42 -07:00
4b956d5eea
Fix MemTest86 extraction 2018-12-27 17:51:51 -07:00
a39c62eabc
Fix crash if no sensors available 2018-12-27 17:47:01 -07:00
dcc2e5cd6a
Adjusted top pane text 2018-12-26 21:00:29 -07:00
98c0c34bf8
Removed unused vertical_graph data 2018-12-26 17:11:37 -07:00
96d34ceb50
Fix SMART short-test results section
* OVERRIDE status reduced to yellow/warning
  * Allows it to be elevated to NS or TimedOut
* Only disable other disk tests on test.failed
  * OVERRIDE doesn't work if based on test.passed for this test
2018-12-23 17:33:16 -07:00
6e37736146
Only save attributes to log during show_results() 2018-12-23 17:15:50 -07:00
c15eb85a5e
Removed unused get_status_color and Skipped status 2018-12-22 18:07:06 -07:00
6d9f50629c
Reworked status/color sections 2018-12-22 17:55:49 -07:00
d37923a31c
Bugfix: typo 2018-12-20 17:26:27 -07:00
d930bdddbd
Zero beginning of UFD before formatting
* Fixes issue #68
2018-12-20 16:10:08 -07:00
d60aab9584
Updated MemTest86 to 8.0
* Passmark is no longer providing ISOs so the UFD image is used instead
* This is an alternative solution to issue #71
2018-12-20 16:03:54 -07:00
eed8a1e40c
Fix poweroff/reboot calls 2018-12-20 15:25:39 -07:00
c6eb7cdfd6
Use new arguments when calling hw-diags 2018-12-19 18:53:13 -07:00
f022d0ca76
Fallback to HW-Diags CLI if X fails to start
* Fixes issue #74
2018-12-19 18:45:58 -07:00
42407f0eca
Adjusted ddrescue exit handling
* Wait for ddrescue_proc after KeyboardInterrupt
  * ddrescue prints extra info to the screen after a CTRL+c
* Explicitly mark KeyboardInterrupt events as an abort
* Add 'DDRESCUE PROCESS HALTED' message in red if exiting non-zero
  * More clearly indicates that user interaction is required
  * Fixes issue #72
2018-12-18 20:35:21 -07:00
44fe888230
Replaced ddrescue-tui-smart-display
* Output data to file and have tmux pane watching said file
* This method handles resizing much better
2018-12-18 20:15:35 -07:00
62b8e51705
Updated ddrescue-tui tmux pane size handling 2018-12-18 19:45:02 -07:00
ad15cdad56
Added warning if not saving map to a preferred FS
* Fixes #76
2018-12-18 17:28:06 -07:00
04cfdff2bf
Don't show init, just disk details 2018-12-18 17:27:15 -07:00
e1834d5179
Added silent mode to init_global_vars() 2018-12-18 17:26:20 -07:00
ad9662c120
Updated to use new hw_diags.py 2018-12-18 16:38:40 -07:00
fad65b8df6
Merge branch 'hw-diags-rewrite' into dev 2018-12-18 16:10:34 -07:00
e5f0ccb5d5
Formatting cleanup 2018-12-18 15:57:48 -07:00
91a77bb14e
Ensure SMART timeout message is in the report 2018-12-18 15:47:03 -07:00
7ac035c578
Safety wheels off 2018-12-18 15:21:05 -07:00
932669844b
Fixed tmux pane size handling 2018-12-18 15:13:33 -07:00
10ae59be19
Update tmux layout periodically 2018-12-18 00:55:57 -07:00
0c0f8e8950
Added disable_test() to Disk class 2018-12-17 20:51:02 -07:00
41c9a4d23f
Fixed only showing non-empty graph lines 2018-12-17 20:29:09 -07:00
8c5820d5aa
Fix horizontal graph
* generate_horizontal_graph() now returns a list instead of a str
2018-12-17 20:16:35 -07:00
ec8c78197b
I/O Benchmark test is working 2018-12-17 20:15:40 -07:00
385bdd7dbf
Allow resizing current pane 2018-12-17 20:10:58 -07:00
a25a10e616
More abort logic updates 2018-12-17 14:07:19 -07:00
c820d2ac6d
Fixed Prime95 abort handling 2018-12-17 13:20:39 -07:00
baaf1994e3
Catch keyboard interrupt and gracefully abort 2018-12-16 22:44:46 -07:00
e0a2993c36
Skip disk safety checks if only testing the CPU 2018-12-16 22:18:34 -07:00
d8123a71ec
Renamed generate_report to generate_sensor_report 2018-12-16 22:07:34 -07:00
4c0bb1c9b7
Group results by device instead of test 2018-12-16 22:06:03 -07:00
503e6f2b42
Fix SMART short-test timeout detection 2018-12-16 19:45:25 -07:00
a4896a55f6
Adjust log names 2018-12-16 19:31:34 -07:00
8993b483a6
Fix bad cable note 2018-12-16 19:30:46 -07:00
ef42b596d9
Catch CTRL+c aborts and show results 2018-12-15 18:56:41 -07:00
8b936f5413
badblocks section working 2018-12-15 18:45:43 -07:00
e96ac5c156
Added watch option to use tail instead of cat
* tail -f acurately prints backspace (^H) characters
  * badblocks output uses them and wouldn't work with watch/cat
2018-12-15 18:09:54 -07:00
dc8416b5f7
Adjusted formatting 2018-12-15 16:55:32 -07:00
a5d92537f5
Removed unused function 2018-12-15 16:54:48 -07:00
f2a519b7ec
Adjusted log and results screen 2018-12-14 18:58:32 -07:00
37b8676b9c
Fixed quick check 2018-12-14 18:57:30 -07:00
99984603ed
NVMe/SMART sections working
* Added timout status for clarity
* Added short-test result to report
2018-12-14 18:32:17 -07:00
cee8252455
Added CYAN to COLORS 2018-12-14 18:03:00 -07:00
81f05fa79f
Replaced show_attributes() with generate_report()
* Returns list of colored strings
* Optionally includes short-test results
* Optionally excludes disk info
2018-12-14 16:37:14 -07:00
5b74879805
Fixed OVERRIDE and N/A NVMe/SMART status handling 2018-12-13 19:02:28 -07:00
b5c93317dc
Override sections working 2018-12-11 23:54:02 -07:00
47084efe17
Combined nvme_check() and smart_check() 2018-12-11 23:18:51 -07:00
62a60ff3fd
Reworked disk safety checks
* Moved several functions into DiskObj
* Added HW_OVERRIDES_FORCED and HW_OVERRIDES_LIMITED to main.py
  * These adjust when overrides are requested
* Disable badblocks and/or io_benchmark if disk fails safety check
2018-12-11 22:56:09 -07:00
a967a5c425
Switched back to int keys for SMART attributes
* Allows for easier sorting
2018-12-11 20:40:57 -07:00
a3f7e5ad89
Disk quick check almost done 2018-12-11 00:54:16 -07:00
6c06a67fdf
Prime95 section complete 2018-12-10 22:54:56 -07:00
d9554314d5
Updated run_program() and popen_program()
* Use dicts for clarity
* Support cwd flag
2018-12-10 19:42:10 -07:00
a2ef06e6db
Added strip_colors() function 2018-12-10 19:19:35 -07:00
2b43cdf9e2
Create watch file if it doesn't exist yet 2018-12-10 19:19:11 -07:00
30d4acd986
Added watch mode to respawn-pane 2018-12-10 19:18:16 -07:00
8a8a63eb66
Build Prime95 report 2018-12-10 19:16:43 -07:00
a00105f718
Fixed status updates 2018-12-10 16:57:43 -07:00
bb93386fa0
Updated Prime95 checks 2018-12-10 16:32:00 -07:00
465a3b42fb
Kill all tmux panes before exiting 2018-12-08 18:36:50 -07:00
d88a9f39f2
Added tmux_kill_all_panes() 2018-12-08 18:36:24 -07:00
668c7c4c6a
Updated run_mprime_test to use test_obj 2018-12-08 18:32:03 -07:00
941a553766
Renamed "Prime95 & Temps" to "Prime95" for brevity 2018-12-08 18:16:31 -07:00
49471663f5
Use OrderedDicts to avoid lambda sorting 2018-12-08 17:50:11 -07:00
0390290f10
Added TestObj()
* This object will track test specific vars and results
  * Moved status code into TestObj
  * Test calls will now be: run_test(state, dev, test_obj)
* NOTE: Code is not done and is quite broken
2018-12-08 17:46:17 -07:00
6a3ef60881
Added CpuObj and renamed dev names to disk
* This should make the code more clear
* The CpuObj is similar to DiskObj to abstract the device/tests calls
  * New calls will be like: run_test(state, dev)
2018-12-08 17:41:29 -07:00
12ff99eb32
Set LogDir for non-quick tests 2018-12-06 18:27:43 -07:00
a910f2cb03
Adjusted Prime95 countdown 2018-12-06 18:27:19 -07:00
ca4234b1c3
Added working_dir arg for tmux command sections 2018-12-06 15:29:06 -07:00
dc606a8780
Main Prime95 sections working
* Still need check results and update progress sections
2018-12-06 01:06:21 -07:00
30ba651674
Removing report wrapping section
* Doesn't work properly with background processes
2018-12-06 00:10:51 -07:00
74bb31e795
Open temps monitor during run_mprime 2018-12-05 23:57:38 -07:00
5550cce8db
Add background mode for monitoring sensors
* This will be called by hw_diags.py to update a file in the background
* NOTE: This uses a naive check before attempting to write data
2018-12-05 23:55:15 -07:00
c777d49091
Added tmux_resize_pane() 2018-12-05 23:54:37 -07:00
5405b97eb1
Standalone sensor monitor working again 2018-12-05 23:09:42 -07:00
46080b4363
Moved tmux sections to separate file 2018-12-05 22:25:44 -07:00
0e5fab0104
Handle missing labels in generate_report() 2018-12-05 21:57:55 -07:00
95b0d1e3f4
Wrap reports if necessary 2018-12-05 21:54:41 -07:00
328d6eb294
Modify sensor_data in place 2018-12-05 20:47:40 -07:00
2eccc236a9
Added generate_report()
* Also merged save_max_temp() with update_sensor_data()
  * Max doesn't need resetting so just calc max everytime
2018-12-05 20:40:25 -07:00
7140f38ba4
Added average, clear, and max temps sections 2018-12-05 20:11:10 -07:00
cb67f7e3c3
Added new sensors.py and dropped borrowed sensors 2018-12-05 19:59:41 -07:00
5dd8fa8416
Get CPU details from lscpu 2018-12-05 17:48:30 -07:00
163f64dda7
Reduced timeout for major exceptions 2018-12-05 04:10:20 -07:00
372f80bf38
Skip optical drives 2018-12-05 04:08:59 -07:00
7c163a8110
Added update progress sections 2018-12-05 03:52:24 -07:00
d025b8dc9e
Adjusted how devices are added to the state obj
* The change allows for devices to be (dis)connected while the script is running
  * Devices are scanned and added during run_hw_diags()
* Fixes bug that prevented any devices from being added as well
2018-12-05 03:49:25 -07:00
2d69d93154
Added watch option for tmux_split_window() 2018-12-05 03:41:27 -07:00
43b9645c69
Update tmux panes via respawn-pane
Instead of send-keys
* Avoids flooding zsh history
* Less flickering
2018-12-04 23:39:15 -07:00
4bb1402ac5
Added tmux functions
* Going to try and replace the send-keys sections next
2018-12-04 20:50:47 -07:00
8fb1620c94
Added placeholder functions for HW tests 2018-12-04 19:23:35 -07:00
597a236089
Don't clear screen twice at startup
* Combined init_global_vars and add_devs output
2018-12-04 18:44:52 -07:00
1489ad4237
Added safety check for devices 2018-12-04 18:43:50 -07:00
62c9d82fd2
Adjusted placeholders 2018-12-04 17:05:53 -07:00
5701b53026
Added --quick argument to skip menu 2018-12-04 16:55:17 -07:00
6014a8fb70
Don't add WK or loopback devices 2018-12-04 16:18:45 -07:00
70a742e69c
Add device details from lsblk
* Also ensure sane types for some attributes
2018-12-04 16:10:58 -07:00
2df4d48bb3
Show selected tests on run 2018-12-03 20:15:56 -07:00
560929e2fa
Removed extra line break in menu_select 2018-12-03 19:54:06 -07:00
18fc97293e
Renamed Drive to Disk to align options in menu 2018-12-03 19:50:55 -07:00
3fdd8c629c
Rewrote main menu
* First options are presets followed by individual tests
* Selecting presets will toggle the selections
* Screensavers are hidden but still present
2018-12-03 19:47:44 -07:00
10f2fca2bf
Added classes DevObj and State 2018-12-03 17:52:07 -07:00
83dda97ff6
Bugfix: launchers.py 2018-11-26 19:13:00 -07:00
c42c764789
Updated hw_diags.py 2018-11-26 18:35:33 -07:00
f802ea860d
Updated ddrescue.py 2018-11-26 18:15:41 -07:00
bb23d49833
Adjusted mounting shares/volumes 2018-11-26 18:14:06 -07:00
b3b821a868
Allow mounting all volumes per device 2018-11-26 18:12:24 -07:00
8a86edb5bb
Updated windows_builds.py 2018-11-23 18:33:18 -07:00
972d91a4b8
Updated sources.py 2018-11-23 18:32:52 -07:00
e3076152ba
Updated main.py 2018-11-23 18:31:36 -07:00
566e1474a5
Updated launchers.py 2018-11-23 18:24:05 -07:00
2d9de7b69e
Updated system diags/checklist and user checklist 2018-11-23 18:22:56 -07:00
5da9d4e36b
Updated update.py and update_kit.py 2018-11-23 18:21:33 -07:00
7e960df2d6
Updated setup.py 2018-11-23 18:18:00 -07:00
832ef993e6
Updated repairs.py 2018-11-23 18:13:11 -07:00
1cac083916
Updated info.py 2018-11-23 18:12:36 -07:00
7f37bc8802
Updated diags.py 2018-11-23 18:10:50 -07:00
1839edf84d
Updated cleanup.py 2018-11-23 18:09:31 -07:00
7f7c220073
Updated browsers.py 2018-11-23 18:08:41 -07:00
18b13cf506
Updated common.py 2018-11-23 18:06:57 -07:00
923ddd7cd3
Removed whitespace from more empty lines 2018-11-23 18:04:12 -07:00
8064fc4a17
Removed whitespace from empty lines 2018-11-23 18:01:03 -07:00
63fcaed8cd
Updated Launchers 2018-11-23 17:54:46 -07:00
5e1daf36df
Updated Notepad++ config 2018-11-23 17:08:32 -07:00
5380d133e4
Adjusted Linux boot options 2018-11-23 17:07:13 -07:00
509620707c
Partially reverting commit d31991a6 2018-10-10 16:54:12 -06:00
bf354edeae
Fix hw-sensor bug caused by upstream code 2018-10-10 15:48:18 -06:00
1cb7de08f3
Add small delay to network startup
* Will hopefully allow test-stations to update the hostname more reliably
2018-10-10 15:47:48 -06:00
95c8de0a21
Merge branch 'dev' of github.com:2Shirt/WizardKit into dev 2018-10-08 15:48:45 -06:00
6a67052d83
Show SMART for parent dev if child dev selected 2018-10-08 15:47:40 -06:00
2Shirt
087500c9b7 Fixed inconsistent indent length 2018-10-02 23:09:20 -06:00
2Shirt
85e7813539 Check Secure Boot status during system checklist
* Fixes issue #60
2018-10-02 22:11:18 -06:00
2Shirt
7e17a93d42 Unmute audio before opening XMPlay with NirCmd
* Fixes issue #56
2018-10-02 15:59:21 -06:00
6f5a25d65d
Load AMD microcode when booting Linux in rEFInd 2018-09-29 15:26:28 -06:00
ecb9364bd2
Updated Syslinux menus
* Added AMD microcode (fixes issue #61)
* Disabled copytoram when booting from an ISO/DVD
* Removed Extras menu and instead list all options from the start
2018-09-29 15:22:01 -06:00
c7da54d86a
Disable blank warning 2018-09-28 14:37:23 -06:00
e6d7d8699a
Restored missing photorec-sort script 2018-09-28 12:50:09 -06:00
10f1982c23
Removed unused startup scripts 2018-09-28 11:43:02 -06:00
1e6f486865
Adjusted X startup sequence
* Moved most X startup logic to ~/.update_x
  * This is called by both i3 and openbox
* Network logic moved to .zlogin
  * This avoids a bug where apps can no longer connect to the $DISPLAY
2018-09-27 23:10:30 -06:00
79b64e4f23
(re)disable root logins (again) 2018-09-27 23:00:17 -06:00
c43ba34cbf
Differentiate between not-run and unknown results 2018-09-27 21:00:00 -06:00
26eadebf21
ddrescue-tui: Support devices with '/' in the name 2018-09-27 13:13:42 -06:00
7da01be7ab
Removed inxi 2018-09-26 16:16:58 -06:00
3b27d05fd6
Disabled HDT menu entry
* See issue #57
2018-09-25 20:51:40 -06:00
a3c82023e8
Removed unused file 2018-09-25 15:17:44 -06:00
5e73583e00
Mark declined overrides as "Skipped"
* NS should be reserved for known failures not unknown/questionable states
2018-09-25 12:33:11 -06:00
4b16ec6095
Adjusted Prime95 countdown 2018-09-25 12:24:47 -06:00
d4f24eafb6
Fix issue #55 2018-09-25 12:17:38 -06:00
6c4381c3a5
Include percent with rates in "raw" I/O log 2018-09-25 12:15:28 -06:00
4979fbe927
Taller I/O horizontal graph
* Inceases fidelity to 32 steps
2018-09-25 11:52:24 -06:00
9689f5aa15
Adjusted I/O chunk size and graph scale 2018-09-25 11:51:22 -06:00
a4d559f406
Removed more VCR 2008 references 2018-09-25 11:46:15 -06:00
883305ca6b
Replaced pacinit alias with full script 2018-09-18 13:42:51 -06:00
48f789c5b4
(re)Disable root SSH logins 2018-09-18 13:12:17 -06:00
b34187b86a
Use new Firefox 62 method to install uBlock Origin 2018-09-17 20:04:47 -06:00
79fc40e57a
Fixed Python 3.7 dependencies
* This re-upgrades Python to 3.7 in WinPE
2018-09-17 18:50:55 -06:00
e3aaa887c5
Countdown the minutes remaining during Prime95
* Fixes issue #54
2018-09-17 14:15:19 -06:00
50a503240d
Downgrading Python to 3.6 in WinPE
* Python wouldn't load
2018-09-16 23:08:11 -06:00
ae8993821f
Missed a VCR 2008 section 2018-09-16 21:05:09 -06:00
9c02626937
Updated update_adwcleaner() 2018-09-16 21:03:49 -06:00
902a6398ca
Bugfix update_samsung_magician() 2018-09-16 20:58:25 -06:00
1e6eb26c77
Removed Office 2013 sections 2018-09-16 20:02:15 -06:00
d502f769ea
Updated update_samsung_magician() 2018-09-16 19:58:36 -06:00
bc57230418
Replaced TreeSizeFree with WizTree 2018-09-16 19:44:41 -06:00
f3885f25d6
Update FastCopy using new installer 2018-09-16 19:39:05 -06:00
e4bcf88fe5
Update Intel RST (Current Release) 2018-09-16 19:23:36 -06:00
4e9cd1f114
Update FastCopy using new installer 2018-09-16 19:21:36 -06:00
b79cd5d65a
Updated tool versions
* Adjusted bundles
* Dropped Office 2013
* Moved to Python 3.7
* Replaced TreeSizeFree with WizTree
2018-09-16 18:46:02 -06:00
a71f7648c2
Bugfixes for Build Linux script 2018-09-16 18:45:10 -06:00
7cc31e892b
Merge branch 'dev' of github.com:2Shirt/WizardKit into dev 2018-09-16 15:42:07 -06:00
6cdf2a4211
Added authorized_keys file for SSH connections 2018-09-16 15:41:14 -06:00
a213ba5d32
Bugfix for mount-all-volumes 2018-09-15 21:20:52 -06:00
91f7628081
Updated sources
* Dropping 2008
2018-09-15 18:17:58 -06:00
35fd50771c
Update hw_diags.py systemctl command syntax
* Now it matches the wk-power-command style
2018-09-15 17:50:54 -06:00
1e21c04a3e
Address shutdown slowdowns
* Unmount filesystem(s) and flush write cache before poweroff/reboot
* Also adjusted timouts to maybe fix issue #52
2018-09-15 17:46:05 -06:00
da92cee338
Fix issue #51
* The curly braces were being interpreted incorrectly by print_standard()
2018-09-15 16:00:24 -06:00
9a093ace9c
Moved 'Scanning disks...' message in hw_diags.py
* (Re)fixes issue #46
2018-09-15 15:47:47 -06:00
1ee4a611b9
Hide UFD-only boot options from Linux ISOs
* Fixes issue #41
2018-09-15 15:42:40 -06:00
d31991a67f
Always load broadcom before tg3
* Hopefully won't cause any problems.
2018-09-15 15:24:59 -06:00
3a801ba72d
Updated startup settings
* Added support for HiDPI devices
  * Only affects devices with a DPI >= 192
  * Most screen objects are doubled in size
* Updated .conkyrc
  * Vertical offset now set to 24 or 48 (to match URxvt)
  * Removed extra line after network adapters
* Updated .xinitrc
  * Removed dunst logic since `cbatticon` no longer sends notifications
  * Update .Xresources for all programs before `xrdb -merge`
  * Update hostname after `connect-to-network`
* URxvt windows are now based on a 16:9 ratio (instead of 4:3)
* Removed
  * .update_wallpaper (integrated with .xinitrc)
  * .urxvt_default_res (integrated with .update_dpi_settings)
* Fixes issue #45
2018-09-15 15:08:47 -06:00
cdef33d774
cbatticon removed from i3, notifications disabled 2018-09-15 12:38:27 -06:00
879927c37c
Add CoreStorage support to mount-all-volumes
* Checks for any CoreStorage partitions
* If found scans partition with testdisk to find inner volume(s)
* If found mapper devices are added with dmsetup
* Then the device list is built in mount_volumes()
2018-09-14 17:53:35 -06:00
821cb5cd46
Super+t URxvt windows auto-connect to tmux session 2018-09-12 21:02:24 -06:00
cb5ff20378
Start a VNC server during startup 2018-09-12 20:54:49 -06:00
d9a9ce0a86
Allow hw-diags to reattach to the tmux session
* The option to kill the current session and start a new was left in place
2018-09-12 18:56:39 -06:00
deec1746e4
Removed pydf to fix issue #44 2018-09-12 18:20:16 -06:00
34925a72c0
Update hostname via reverse DNS lookup
Should help differentiate systems
2018-09-12 17:44:23 -06:00
56e354f124
Avoid crash described in issue #39 2018-09-12 16:15:15 -06:00
83064d7c90
Fix issue #46 2018-09-12 15:54:36 -06:00
9f12f2c856
Added SMART 199/C7 warning/override to HW-Diags 2018-09-12 15:39:28 -06:00
8fec6fc5b9
Save raw I/O read rates in log 2018-09-12 14:46:04 -06:00
793581ac22
Rewrote I/O benchmark sections
* Displays graph during test and in summary
* Reduce test area to speedup the benchmark
* Addresses issues #48 & #49
2018-09-09 19:41:46 -06:00
5ef7c9b16e
Updated functions/network.py 2018-09-04 22:35:39 -06:00
a35be68780
Add net devices to Conky before starting 2018-09-04 22:22:21 -06:00
0d0defb8de
Merge branch 'datarec' into dev 2018-09-03 23:13:47 -06:00
240c55f407
Remove more whitespace from image/map names 2018-09-03 23:13:17 -06:00
78c6024b95
Merge datarec updates 2018-09-03 23:00:13 -06:00
d35dba7539
Prevent crash when retrying recovery
* IMO ddrescue was exiting too quickly to load the map data so I'll assume 0b
2018-09-03 22:58:20 -06:00
bd47f08996
Removed (Whole) label when imaging
* If only one partition was selected it would be incorrectly labeled "Whole"
  * Easier to remove the label than rework the data structures
2018-09-03 21:45:46 -06:00
9dbfce94d4
Fix auto continue logic 2018-09-03 21:44:28 -06:00
86fc23aed8
Fix pass number in status pane
* It was using the internal 0-2 instead of the display 1-3
2018-09-03 21:42:37 -06:00
dbf4559e14
Adjusted image/map filenames
* Partition filenames should include '_pX_' instead of just '_X_'
* Trailing whitespace should be removed
2018-09-03 21:39:32 -06:00
7cfdddcfbd
Fix using image file for clone source 2018-09-03 21:34:14 -06:00
b2e287520c
Fix help flags 2018-09-03 21:32:31 -06:00
84d7207d90
(Re)Add SMART values 196 and 199
* Value is only displayed, no additional aborts
2018-08-31 15:32:01 -06:00
bb631b39e9
Merge branch 'datarec' into dev 2018-08-19 19:28:03 -07:00
1d0378dd7b
Training wheels off 2018-08-19 19:23:24 -07:00
ee4cea3b01
Added systemd journal pane 2018-08-16 01:58:22 -07:00
0c8de47893
Reworked auto mode and pass status sections 2018-08-16 01:49:06 -07:00
2272d133f9
Fixed update_progress & update_sidepane 2018-08-16 01:18:06 -07:00
afaee53077
Fixed current_pass updates/progression 2018-08-16 00:43:09 -07:00
7d30a735fc
Fix retry option and settings sections 2018-08-16 00:18:25 -07:00
8461e581ea
Updated menu_settings() to use RecoveryState 2018-08-15 23:24:01 -07:00
5948d1a62f
Fixed menu_main() arguments 2018-08-15 22:50:47 -07:00
5ac05c943e
Removed unused function show_device_details() 2018-08-15 22:50:05 -07:00
ca78da4dd4
Updated show_selection_details() 2018-08-15 22:49:43 -07:00
bb270715c1
Updated run_ddrescue() to use new objects 2018-08-15 22:38:54 -07:00
53a899f967
Updated menu_main() to use RecoveryState obj
* Also fixed rescued size calculations (again)
2018-08-15 21:53:22 -07:00
e0a695a673
Enable help flags for aliases 2018-08-15 20:35:09 -07:00
1a983344c2
Updated update_progress() 2018-08-02 00:42:14 -07:00
d474c8b5d4
Updated build_outer_panes() *BROKEN*
* Script broken until update_progress() is fixed
2018-08-01 23:56:25 -07:00
c568668fd0
Re-added 'Create ticket folder?' section
* Only asked if imaging and mounting a local device for the destination.
2018-08-01 23:39:19 -07:00
177bf10e2d
Added select_parts() function
* This replaced menu_select_children()
* Removed menu_select_children()
2018-08-01 23:32:39 -07:00
459b78dcc3
Updated select_dest_path(), now select_path()
* Moved menu_select_path() code into select_path()
* Removed menu_select_path()
* Fixed formatting in get_dir_report()
2018-08-01 23:04:44 -07:00
ccf7f0686e
Updated select_device() to use DevObj()
* Also fixed child/parent check(s)
* Removed menu_select_device() since code was moved into select_device()
2018-08-01 22:25:01 -07:00
03bdb4b4b7
Reordered classes and removed old menu functions 2018-08-01 21:12:05 -07:00
7ac91fd312
Adjust pass 1 threshold 2018-08-01 20:33:35 -07:00
1e195f70fc
Fixed names and started updating build_outer_panes 2018-07-26 20:49:27 -06:00
53f0b93a5f
Misc bugfixes 2018-07-26 20:24:34 -06:00
30b703e025
Updated get_formatted_status() 2018-07-26 20:09:48 -06:00
6cdc4015e7
Updated menu_ddrescue() and related sections
* RecoveryState is updated before confirmation(s)
* New confirmation prompt that supports both cloning and imaging modes
* Refactored show_selection_details() to use new objects
  * Allows resumed state to be detected and prompt switched to "Resume?"
* Renamed function show_safety_check() to double_confirm_clone() for clarity
2018-07-26 19:34:51 -06:00
4047b956f5
Even better exception handling 2018-07-26 18:54:31 -06:00
a19ac4772b
Better exception handling 2018-07-26 18:29:14 -06:00
127c3b810d
Fixed image prefixes and removed unsused functions 2018-07-26 18:07:12 -06:00
d1eefd05ab
Major update to refactor for object-centricity
* Dest/map paths are now set in two steps:
  * The filename prefix is set when creating the DevObj()
  * The full paths are set when creating the BlockPair()
* Merged dest safety checks into RecoveryState.add_block_pair()
  * Mostly check_dest_paths() and dest_safety_check()
* Moved dir RWX checks to is_writable_dir()
* Moved mount RW check to is_writable_filesystem()
* Started merging menu_clone() and menu_image() into menu_ddrescue()
2018-07-26 17:31:39 -06:00
6aeba34bdb
Include path in dir report 2018-07-25 23:57:50 -06:00
66c7563335
Set details for Dev/Dir/Image objects
* Colored report data is generated during obj instantiation
  * Code has been moved into its own function
  * Entire colored string is now stored for each Obj
  * (Should make show_selection, etc more mode/Obj agnostic)
* loopback_dev vs image_path is now better separated
  * losetup is called in ImageObj.set_details()
  * loopback -D is still called during program cleanup/wrapup
* get_device_size_in_bytes() has been renamed get_size_in_bytes()
2018-07-25 23:31:04 -06:00
180eb0f9ef
Added base, dev, dir, and image objects 2018-07-25 21:44:40 -06:00
98b05c93bf
Moved menu_ddrescue() to ddrescue-tui-menu file
* Let's parse the sys.argv earlier in the process
2018-07-24 00:54:58 -06:00
fa3b3b11b0
Added methods: load_map and self_check(s)
* load_map() is called on BlockPair() instantiation
  * This partially replaces resume_from_map()
* Also fixed improper method declarations lacking the self argument
2018-07-24 00:39:22 -06:00
f5ff65bfe0
Started rewriting ddrescue.py
Added two classes:
* BlockPair()
  * Track source/dest pair specific data
  * update_progress() method for its own data
* RecoveryState()
  * Track BlockPair objects and overall state
  * update_progress() method for overall data

Reasons:
* Code readability
* Better status updates, code currently split between:
  * get_recovery_scope_size()
  * resume_from_map()
  * update_progress()
* Functions that should probably be merged into other functions:
  * get_recovery_scope_size()
  * set_dest_image_paths()
  * check_dest_paths()
* Logic that needs to be cleaned up:
  * Calculating overall recovery size
  * Pass "Done"ness and status strings need separated
  * Pass "Done"ness at the device and overall levels
  * Updating output for side pane status display
2018-07-23 23:25:12 -06:00
2430ba5e00
Resume session via map file(s)
* Read map file(s) and set progress, status, and current pass
2018-07-23 00:43:22 -06:00
f5994d851b
Allow more characters in get_simple_string() 2018-07-22 21:56:52 -06:00
cd955fe1fc
Add overall recovery status to side-pane
* --test-mode disabled by default
* Fixed bug that prevented escaping auto_run via Ctrl-c
* Fixed no-trim / no-scrape flag handling
* Only proceed device(s) have been selected in menu_select_children
2018-07-22 21:56:39 -06:00
1f63f91144
PEP8 Cleanup 2018-07-22 16:27:34 -06:00
9e48c1d1a6
Read data from MAP files (Big update)
* Added read_map_file() which uses ddrescuelog to create dict of current state
* Added --test-mode= option to expert menu
* Add size (in bytes) to all devs
  * Allows to calculate real total percent recovered
* Detect 100% completion via ddrescuelog -D
* Moved mark_complete / mark_incomplete code to update_progress()
* Update progress every 30s during ddrescue passes
* Fixed auto_run logic
2018-07-22 02:03:04 -06:00
6b28444c36
Fix function order 2018-07-21 20:31:39 -06:00
d7dfb34b02
Resume function working for imaging cases 2018-07-20 18:06:59 -06:00
37734e65bf
Bugfix: Paths are now relative to the current dir
* They were relative to the script's dir before
2018-07-20 17:53:09 -06:00
281607f3e4
Adjusted confirm/show details order 2018-07-20 13:57:55 -06:00
93c9b206d9
Added ddrescue-tui aliases wkclone and wkimage 2018-07-20 13:56:49 -06:00
6582293370
Initial resume code -- Needs testing 2018-07-19 01:34:14 -06:00
5f4598814a
Clear screen before printing abort warning
* Otherwise the "Abort" string is in the middle of the ddrescue output
* Also added secondary return code to be treated as a user abort
2018-07-19 00:45:04 -06:00
016f87b76c
Don't hide source dev when selecting dest dev
* Disable the entry instead
* It's more clear what's being done
2018-07-19 00:43:41 -06:00
7597394d61
Build real ddrescue cmd for Cloning or Imaging
* --force is only used for cloning
2018-07-18 23:53:05 -06:00
d09664bb7d
Misc cleanup 2018-07-18 23:37:02 -06:00
f84413f1a9
Fix SMART not available warning 2018-07-18 23:36:15 -06:00
e640caee74
Add dest image/map path sections 2018-07-18 23:19:42 -06:00
646e1a3764
Show list of authorized fstypes with error 2018-07-18 22:17:32 -06:00
19dcc87950
Pause when showing usage 2018-07-18 22:09:47 -06:00
e5ce254e8b
Verify destination FS is mounted read-write 2018-07-18 22:02:17 -06:00
f2c557f77c
Added safety checks for the destination
* Dev size / avail space checks
* Permission checks
  * No mount option checks (yet?)
2018-07-18 20:54:51 -06:00
88c28a3f25
Added auto-continue code
* Enabled by default
* Based on static thresholds per pass.
  * Pass 1: 85%
  * Pass 2: 98%
* If using child devices, all must be above the threshold to continue
2018-07-18 18:26:03 -06:00
9d91a28d7a
Add children pass, status, and update sections
* Updating device / child device status/progress done in mark_*() functions
* Add current pass description to main menu
* Current pass (overall) only updated if all children have passed
* Fix Pass 4 crash
2018-07-17 23:22:08 -06:00
c705ba6afc
Add pass completion detection sections
* Retry option now sets recovery back to pass 1
2018-07-17 22:10:37 -06:00
a12a591279
Moved SMART sections to a separate script
* Refresh rate is now handled by 'watch --interval'
* Allows for much simpler ddrescue execution / tracking
* Removed all 'SMART Report' sections from functions/ddrescue.py
* functions/hw_diags.py has been further extended
  * Supports full device paths (only for displaying attributes ATM)
  * Adds a timestamp when only displaying attributes
2018-07-17 21:05:37 -06:00
358191539c
Added run_ddrescue() and update_smart_report()
* Working "wait" loop while ddrescue is running.
2018-07-17 19:19:38 -06:00
d1d3e1592e
Added get_process() 2018-07-17 18:11:23 -06:00
7d851d2222
Add settings menu 2018-07-17 16:59:45 -06:00
310a2eb63a
Initial Main Menu code
* Required refactoring pass status code
* Need to add settings menu next
2018-07-17 16:01:29 -06:00
fd8ac7cf1a
Add child device selection menu for Image mode
* Can select either whole device or child dev(s), not both
2018-07-17 14:16:38 -06:00
de8f3bbd2b
Use image file instead of loopback device
* Still setup loopback for image details but use image directly in ddrescue
* Adjusted outer/side panes to use image path instead of loopback dev
2018-07-17 13:21:12 -06:00
29266f1611
Added initial Imaging source child dev support 2018-07-17 01:11:43 -06:00
1e4a3b6c0e
Fix provided_path for Imaging and adjust top panes
* Moved select_path menu sections to menu_select_path()
2018-07-17 00:49:41 -06:00
007d2ef692
Added select_path() for Image mode
* Can select the current path, a local device's volume, or enter manually
* Optionally add a ticket folder to path before imaging
2018-07-17 00:15:28 -06:00
c37dab58af
Updated mount_all_volumes(), now mount_volumes()
* Now allows mounting R/W
* Can restrict to a specific device's volume(s)
* Added more data to the returned report
2018-07-17 00:06:43 -06:00
6eb486c770
Extend get_simple_string() to support underscores 2018-07-17 00:05:47 -06:00
ae7ba9cba4
Fixed typo in mount-raw-image 2018-07-16 22:25:13 -06:00
9a27afebf7
Moved selection details into its own function
* Will allow for better duplication in Image mode
2018-07-16 22:19:39 -06:00
6643cf5d25
Moved outer pane section to its own function
* Will allow better duplication with Image mode
2018-07-16 22:08:00 -06:00
552868c26e
Moved safety check into its own function
* Will allow better duplication with Image mode
2018-07-16 22:04:09 -06:00
69909fa34c
Added safety check 2018-07-16 21:02:53 -06:00
855884ec93
Added initial update_progress() sections
* TODO: expand to support Image mode
2018-07-16 21:01:10 -06:00
ae4f2ac680
Added outer panes 2018-07-16 19:40:29 -06:00
adc1283330
Add pydf and alias df to pydf
* Fixes issue #40
2018-07-16 18:17:38 -06:00
b1541c0faf
Added alias for hexedit 2018-07-16 18:10:30 -06:00
b5d8a55031
Reordered functions 2018-07-16 18:07:12 -06:00
e56296d8b0
Consolidated device selection code
* Common code moved to select_device()
* Existing select_device() renamed menu_select_device()
* Fixed skip_device code
* Refactored source/dest vars into dicts
* Added confirmation after source/dest are selected
2018-07-16 18:01:06 -06:00
b2fc7ea860
Renamed script ddrescue-tui, added launcher script
Launcher script runs the python script in tmux (same as hw-diags)
2018-07-16 17:58:29 -06:00
0c3b90eb63
Add clone destination sections
* Hide source device in dest selection menu
2018-07-15 00:04:24 -06:00
cfbd0ec8f2
Add device selection menu 2018-07-14 23:45:08 -06:00
667223b3c2
Check passed source
* If it's an image, setup loopback dev
* If it's a child block dev, prompt with option to use parent block
* Show selected source details
2018-07-14 22:52:18 -06:00
8b1e19fa4b
Initial wk-ddrescue menu 2018-07-14 21:19:08 -06:00
d57b08ec6f
Update hw_diags so it can be used by wk-ddrescue 2018-07-14 21:17:32 -06:00
afef5e9052
Add safe alias for ddrescue 2018-07-14 19:41:52 -06:00
2Shirt
bbfcc2e3fe Hotfix: Handle size=None in human_readable_size() 2018-05-30 17:26:49 -06:00
2Shirt
38934027a4 v1.5.0 - Early Summer Update
Main Kit
* `mount-all-volumes` will now recognize LVM and RAID volumes
* Local sources supported by "User Data Transfer.cmd"
* Ticket numbers are now optional _(enabled/disabled via main.py)_
  * If disabled some sections will ask for a "search" prefix instead
  * If disabled some sections will use date/time instead
* AV check added to System Checklist and Diagnostics
* Adjusted the summary order in System Checklist and Diagnostics
* Reworked OS detection
  * Insider Previews are now properly detected
  * Windows 10 1803/April Update is now recognized
  * CurrentBuild number is displayed for unrecognized builds
  * Codenames are displayed for all recognized builds
* Bumped tool versions
  * Current Intel RST is now 16.0
* Moved SafeMode scripts to the Misc folder
* General bugfixes, including:
  * "Copy WizardKit.cmd"
  * "Build Kit.cmd"
  * "Enter SafeMode.cmd"
  * "Exit SafeMode.cmd"
  * Several scripts will now show a file/program missing error instead of crashing

Linux
* Deprecated `inxi` and will be removed in a future build.
* Added new `hw-drive-info` script to replace `inxi` command
* Added new `hw-info` script to replace `inxi` command
* Added several graphical viewers for file browsing (archives, images, PDfs, etc)
* Trimmed image size by removing unnecessary packages _(mostly dialup/networking packages)_
* `build-ufd` logs are now saved in the current user's $HOME/Logs folder
* `build-ufd` names UFDs as "${KIT_NAME_SHORT}_UFD" _(e.g. WK_UFD)_
* General bugfixes

WinPE
* Added VirtIO drivers
* Local sources are working again for Windows installs
* WinPE.log is now copied to new Windows installations
* General bugfixes, including:
  * "Build PE.cmd"
2018-05-25 14:28:48 -06:00
2Shirt
7559a673ef Added VirtIO drivers 2018-05-23 19:20:57 -06:00
2Shirt
9ed4c6209b papirus-icon-theme has moved to the community repo 2018-05-22 21:22:00 -06:00
2Shirt
2dabfd4020 Hide more root items 2018-05-22 20:55:11 -06:00
2Shirt
341f424eae Use a different label for combined kits
* WK_LINUX doesn't reflect what the UFDs actually contain
2018-05-22 20:47:18 -06:00
2Shirt
69cbbbc203 Suppress SDIO warning
If there's hidden folders at the root of the device it's running from
then it shows a red banner with a "you may have a virus!" warning..
This check has been disabled
2018-05-22 20:09:43 -06:00
2Shirt
c7ae1b1dc7 Moved SafeMode scripts into the Misc folder 2018-05-22 20:05:49 -06:00
2Shirt
da61ea3856 Updated SW diag/checklist summaries to match
* Also added AV check to SW diag
2018-05-22 19:33:21 -06:00
2Shirt
0b1d7bb4f3 Adjusted system_diagnostics.py messages 2018-05-22 12:49:00 -06:00
2Shirt
5b0e7b9dfe cbin copied correctly again in Copy WizardKit.cmd 2018-05-22 12:26:43 -06:00
2Shirt
0063de6846 Bump TeamViewer version 2018-05-22 12:24:33 -06:00
2Shirt
629d29ec99 Allow LVM devices in udevil
* Part of the #38 fix
2018-05-21 20:38:05 -06:00
2Shirt
24df753a40 Add support for LVM and RAID to mount-all-volumes
* Renamed get_mounted_data to get_mounted_volumes
* Report data is now a dict for better clarity
* Widened report hoping that LVM names will fit (they probably wont)
* This fixes #38
2018-05-21 20:25:12 -06:00
2Shirt
e6b7cc602b Report missing hw-info data
* Show UNKNOWN for missing DMI variables
* Suppress errors for systems w/out sound cards
* Suppress errors for glxinfo
* Keep revision numbers for network devices
2018-05-21 20:18:13 -06:00
2Shirt
25d34e5ace Copy WinPE.log to new Windows installations 2018-05-21 15:57:24 -06:00
2Shirt
70e4797b7a Refactored windows_image code
* Better names (e.g. 'Letter' instead of 'Source')
* Added 'Local' bool to simplify network-vs-local installs
* Only reassign the source letter if necessary
* Bugfix: Update 'Path' when reassigning a volume letter
* Fixes #33 (again)
2018-05-21 15:43:05 -06:00
2Shirt
3285a640c7 Merge branch 'dev' of github.com:2Shirt/WizardKit into dev 2018-05-18 21:04:49 -06:00
2Shirt
fb16b0e748 Deprecated inxi
* Displays too much info
* Fixes issue #37
2018-05-18 21:03:36 -06:00
2Shirt
352bf042b0 Fixed typo 2018-05-17 21:47:56 -06:00
2Shirt
7e8f9df877 Set Intel RST 16.0 as current release 2018-05-17 21:40:44 -06:00
2Shirt
1d3be750b4 Bump tool versions 2018-05-17 21:39:33 -06:00
2Shirt
0a8db0a3d9 Merge branch 'optional-tickets' into dev
* Fixes #36
2018-05-17 21:02:17 -06:00
2Shirt
50a200535e Fix log dir permissions 2018-05-17 20:59:57 -06:00
2Shirt
e305b3e60f Add warning for missing archive in extract_item() 2018-05-17 20:56:55 -06:00
2Shirt
27953bde5a Update backup/restore code
* Added support for local backups
* Added volume label detection for local backups
* Replace spaces in backup_prefix with underscores
2018-05-17 20:54:45 -06:00
2Shirt
b997a52385 Updated hw-diags section
* Use date_time instead of ticket_number if disabled
2018-05-17 18:17:36 -06:00
2Shirt
5902a51f9e Save build-ufd logs in ${SUDO_USER}'s $HOME/Logs 2018-05-17 18:15:39 -06:00
2Shirt
02054a8047 Updated system checklist and diagnostic scripts 2018-05-17 18:07:18 -06:00
2Shirt
db09236b26 Updated user_data_transfer sections 2018-05-17 18:06:26 -06:00
2Shirt
bec947262b Updated WinPE sections 2018-05-17 18:03:53 -06:00
2Shirt
3114b72178 Add ticket toggle var and get_simple_string func
* get_simple_string() will be used for backup prefixes
2018-05-17 17:57:45 -06:00
2Shirt
5ea499d6ff Assign volume letters before finding source image
* Fixes issue #33
2018-05-17 17:09:22 -06:00
2Shirt
223155b842 Abort on failed download(s)
* Fixes #29
2018-05-17 16:26:07 -06:00
2Shirt
598dea32c7 Save logs to tech's $HOME instead of root's 2018-05-17 15:32:38 -06:00
2Shirt
1c3520806c Avoid nohup.out creation 2018-05-17 15:17:14 -06:00
2Shirt
f1700e5ba9 Adjusted app associations in Thunar 2018-05-17 15:13:26 -06:00
2Shirt
f7d55306be Adjusted packages
* Added ARandR
* Added GPicView
* Added XArchiver
* Switched to Evince over MuPDF
2018-05-17 15:11:36 -06:00
2Shirt
96e008bec7 Switch back to broadcom-wl
* Forgot that DKMS requires the Linux headers and that would bloat the image
2018-05-16 16:04:50 -06:00
2Shirt
2305c047de Adjusted live Linux packages
* Switched to broadcom-wl-dkms
  * Hopefully it doesn't break everything...
* Removed several unwanted packages (for example: modem/dialup packages)
  * Fixes issue #30
* Packages to be added are now tracked in .linux_items/packages/live_add
* Packages to be removed are now tracked in .linux_items/packages/live_remove
2018-05-16 15:11:42 -06:00
2Shirt
0902a7997f Moved SafeMode sections into functions/safemode.py
* Allows for better descriptions of the actions being taken
* Allowd for better error handling
* Fixes issue #34
2018-05-14 12:58:06 -06:00
2Shirt
6868988cec Added antivirus check to the system_checklist
* Fixes issue #31
2018-05-14 12:11:38 -06:00
2Shirt
8ea17268c7 Fixed local sources for user_data_transfer
* Added support for local images and root folders
2018-05-14 09:42:30 -06:00
2Shirt
e751696307 Avoid crash if VCR+ installers are missing 2018-05-14 08:01:09 -06:00
2Shirt
ebffd2a2dd Added more missing file warnings
* Part of the fix for #27
2018-05-14 07:54:33 -06:00
2Shirt
17dc572c4a Added warnings for missing tools 2018-05-13 18:57:27 -06:00
2Shirt
79d2af6e0a Fix issue #27
Several popen_program() calls were not inside try blocks causing full crashes
2018-05-13 18:20:42 -06:00
2Shirt
18c535dcfd Bugfix for OS detection
* Avoids CurrentBuild collision between Win8 and Win8.1
* Fix DisplayName formatting
2018-05-13 16:09:07 -06:00
2Shirt
ee2bcd5aea Refactored OS build detection
* Known build data moved to settings/windows_builds.py
* OS version statically set in windows_builds.py
* Added Insider Previews to recognized builds
  * Shown in red due to their very short support windows
* Windows 8 and Windows 8.1 are now separate versions
* Added codenames to Vista and 7 (for fun!)
* Unrecognized builds have the CurrentBuild number in the DisplayName
2018-05-12 20:13:54 -06:00
2Shirt
97fa91725e Better font support for compton and urxvt 2018-05-12 17:04:47 -06:00
2Shirt
8f0393d173 v1.4.2 - Goodbye Snow
Main Kit
* Fixed issues #21 & #22
* Open speedtest during User Checklist (fixes #24)
* Tool version updates
* Various Bugfixes

WinPE
* Various Bugfixes

Linux
* `build-ufd` now uses a GPT layout with a protective MBR by default
  * Can still build MBR (Legacy) with the `--use-mbr` flag
  * (Hopefully) fixes #20
* `hw-diags`
  * Re-added keyboard test (fixes #25)
  * Add drive I/O benchmark test (fixes #23)
    * All results are in MB/s
* Various Bugfixes
2018-04-26 14:37:03 -06:00
2Shirt
f6d3938ecb Prevent crashes when KIT_NAME_FULL contains spaces 2018-04-20 10:43:13 -06:00
2Shirt
f0bbb1c57e Merge branch 'dev' of github.com:2Shirt/WizardKit into dev 2018-04-16 14:25:42 -06:00
2Shirt
94f74fa1a0 Merge branch 'dev' of https://github.com/2Shirt/WizardKit into dev 2018-04-16 14:21:06 -06:00
2Shirt
04f7ae2f21 Better unit handling during I/O Benchmarks
* All results are in MB/s
2018-04-16 14:17:28 -06:00
2Shirt
b5202d3646 Extend I/O Benchmark to test whole dev 2018-04-16 13:26:35 -06:00
2Shirt
945c771b6e hw-diags-iobenchmark set as executable 2018-04-16 13:01:21 -06:00
2Shirt
501191b388 Include hidden items in EXTRA_DIR/ 2018-04-16 11:37:09 -06:00
2Shirt
c7eb3921fd Fix Linux graphics issue
* Using safer backend for compton
* Removed xf86-video-intel
  * See https://wiki.archlinux.org/index.php/Intel_graphics#Installation
2018-04-16 10:47:57 -06:00
2Shirt
d1f4944a09 Changed linux std user name to tech
* Prevent build failure when ${KIT_NAME_SHORT} starts with a digit
2018-04-16 10:07:51 -06:00
2Shirt
c18d86d8c5 Q-Dir filename changed 2018-04-16 10:07:15 -06:00
2Shirt
9ddfaab8bc inxi moved to AUR 2018-04-16 09:48:05 -06:00
2Shirt
ae18668a72 Type in AIDA64 URL 2018-04-16 09:42:37 -06:00
2Shirt
d893a80f03 PyPI moved 2018-04-16 09:42:03 -06:00
2Shirt
d7111b0e41 Readding noto-fonts 2018-04-16 08:50:59 -06:00
2Shirt
71885212e8 Tool version bumps 2018-04-16 08:47:34 -06:00
2Shirt
e55dbeeb23 Add dd drive I/O Benchmark test
* All tests: runs if SMART=CS/OVERRIDE & BADBLOCKS=CS
* All drive tests: runs if SMART=CS/OVERRIDE & BADBLOCKS=CS
* I/O tests are readonly, blocksize=4M, and limited to 16 Gb
* Fix issue #23
2018-04-16 02:58:34 -06:00
2Shirt
a7079d4eae Added GPT/PMBR support to build-ufd
* Defaults to GPT/PMBR
  * (Hopefully) fixes #20
* Can still build MBR (Legacy) with the --use-mbr flag
2018-04-15 21:00:45 -06:00
2Shirt
c7c23bc7a1 Open speedtest at the end of the User Checklist
* Fix issue #24
2018-04-15 19:19:03 -06:00
2Shirt
4b0dde6efe Re-add keyboard test to HW diag menu
* Fix issue #25
2018-04-15 10:25:49 -06:00
2Shirt
8e22aa22b0 Fix issue #22 2018-03-15 15:28:54 -06:00
2Shirt
b080200118 Fix issue #21 2018-03-15 14:30:46 -06:00
2Shirt
77f3458d71
Expanded openbox-patched dependencies 2018-03-09 14:30:22 -07:00
2Shirt
acd33243eb v1.4.1 - Spring Cleaning
* Bumped version for several tools
* Fixed issues #11, #12, & #19
* Fixed issue causing crashes in `User Data Transfer.cmd`
* Fixed issue causing crashes in `Install SW Bundle.cmd`
* Various bugfixes

* Bumped version for several tools
* Various bugfixes

* Improved `Build Linux` script
  * Better handling of AUR package dependencies
  * Added workaround for `sudo` timeouts
* Improved `build-ufd` script
* Added `mount-raw-image` script
  * Mount dd images (multiple partitions supported)
* Fixed issues #15 & #17
* Various bugfixes
2018-03-09 13:07:22 -07:00
2Shirt
ac1ee5f695 More HWiNFO updates 2018-03-08 19:09:22 -07:00
2Shirt
f37b1cdf44 Updated Build Kit.cmd 2018-03-08 18:37:47 -07:00
2Shirt
6d503fb6c7 Enable TLS 1.2 for PowerShell scripts 2018-03-08 17:33:48 -07:00
2Shirt
2899e34f5e
Update sources.py
Version bumps
2018-03-08 17:02:34 -07:00
2Shirt
5c035cf3b8
Update build_pe.ps1
Version bumps
2018-03-08 16:54:06 -07:00
2Shirt
aadba319b1
Update build_kit.ps1
Version bumps
2018-03-08 16:44:49 -07:00
2Shirt
6f80f0e708 Updated Build Linux --build-iso / main.py sections
* --build-iso loads main.py from $LIVE_DIR instead of $BUILD_DIR
  * Ensures that the settings in $LIVE_DIR and the final ISO match
* --build-iso loads main.py silently
  * Avoids editing the file twice under --build-all
* The ownership of the $OUT_DIR and ISO are set to $REAL_USER instead of root
2018-03-06 04:47:09 -07:00
2Shirt
d9155b9b7e Removed volume icon from i3status bar
* Avoid differing level readouts in i3
  * The volume level is calculated differently for volumeicon and i3status
2018-03-06 04:08:35 -07:00
2Shirt
e4edb809f5 Adjusted AUR package build process
* Don't install runtime dependencies while building packages
* Fix issue #17 (again)
2018-03-06 02:49:21 -07:00
2Shirt
06a72e29fb Add (optional) build-time dependency for TestDisk 2018-03-06 02:26:56 -07:00
2Shirt
1cd52813b1 Add (undocumented) dependency for openbox-patched 2018-03-06 02:13:41 -07:00
2Shirt
f86f2b9ad4 Add (undocumented) build dependency for hfsprogs 2018-03-06 02:03:01 -07:00
2Shirt
4dbb7ae7f1 Using arc-gtk-theme instead of gtk-theme-arc-git
* Avoids (undocumented) gtk3 build-time dependency
* The community package is based on the new soft-fork of the main repo
  * Link for details: https://github.com/horst3180/arc-theme/issues/840
2018-03-06 01:53:00 -07:00
2Shirt
da1d958c11 Removed PulseAudio
* Audio is rarely used so ALSA is fine
* Should help with issue #17
2018-03-06 01:19:56 -07:00
2Shirt
51f9f91195 Wait for user input if run_elevated fails
* This is a workaround for su/sudo timeouts
* Should help with issue #17
2018-02-28 13:32:45 -07:00
2Shirt
d82ad55113 Fix issue #19 2018-02-28 13:15:00 -07:00
2Shirt
49c7880e6a Added mount-raw-image script
* Allows for easier mounting of dd images and the partitions within
* Fixes issue #18
2018-02-28 12:39:27 -07:00
2Shirt
1d2940b92e Updated tool versions in the PowerShell scripts 2018-02-21 18:11:01 -07:00
2Shirt
a5630c2837 Updated HWiNFO download sections 2018-02-21 18:08:47 -07:00
2Shirt
6d5abd3b92
Update launchers.py
Bump current IRST version
2018-02-21 14:02:53 -07:00
2Shirt
64f22fbe30
Updated update.py
Support new HWiNFO archives
2018-02-21 14:02:11 -07:00
2Shirt
751f9422d3
Updated sources.py
Broken sections:
* HWiNFO merged their downloads into a single zip
* There's a new IRST version
2018-02-21 13:59:27 -07:00
2Shirt
1851e05598 Updated README to reflect the new build-ufd script 2018-02-21 13:07:13 -07:00
2Shirt
57cae8c813 Merge branch 'safer-build-ufd' into dev
Build tests passed
Fixes issue #15
2018-02-21 12:53:05 -07:00
2Shirt
f950d6d91b Bugfix: Only copy EXTRA_DIR if ${EXTRA_DIR} is set
It was running 'rsync [OPTIONS] /* /mnt/Dest/' because ${EXTRA_DIR} was empty
2018-02-21 12:47:56 -07:00
2Shirt
b17a8de350 Made umount code more explicit
Avoids some unnecessary warnings
2018-02-21 12:46:57 -07:00
2Shirt
483344af70 Updated build-bfd 2018-02-21 10:35:47 -07:00
2Shirt
0d3f1e87cf Started rewrite of build-ufd
* Using the BASH3 Boilerplate as a base for the new script
* The new version requires explicitly setting all sources
  * Will avoid ambiguous matches / collision issues seen in issue #15
  * Better ensures that the intended sources are used
  * Still verify that '.bin' exists to ensure a valid "Main Kit" source
2018-02-21 00:34:53 -07:00
2Shirt
2fbd401416 Updated year in license 2018-02-20 14:49:54 -07:00
2Shirt
e5ac9e0d1c A typo a day keeps the sanity away 2018-02-20 14:06:42 -07:00
2Shirt
bb6ea3694b Added missing dependencies to fix issue #17 2018-02-20 13:39:37 -07:00
2Shirt
a0c6569eaf
Fix issue #12
The download no longer gets wrapped in a gzip archive.
2018-02-09 11:50:51 -07:00
2Shirt
7d1826f094
FastCopy version bump 2018-02-08 13:40:14 -07:00
2Shirt
e958eedfb6 Fix handing of path separators to prevent crashes 2018-02-07 20:15:31 -07:00
2Shirt
f844977d62 v1.4.0 - Wizard's New Year
* Added ability to upload crash log to a webdav share
  * Verified functionailty with Nextcloud 12
* Added missing CBS fix launcher
* Rewrote user_data_transfer sections
  * Added ability to answer "All" to extract items
  * Fixed issue that caused an infinite recursion involving Windows.old items
  * Unified code for both image and folder sources by using SourceItem objects
* Various bugfixes

* Various bugfixes

* Improved safety checks for the "Build Linux" script
* Updated hw-sensors script to skip all non-temperature sensors
* New build-ufd script to combine the three parts of the kit together
  * See README.md for details
* Various bugfixes
2018-02-02 18:25:24 -07:00
2Shirt
15be408a20
Update README.md 2018-02-02 18:13:23 -07:00
2Shirt
987ea3ab84 Merge branch 'dev' of github.com:2Shirt/WizardKit into dev 2018-02-02 16:41:05 -07:00
2Shirt
bd8151a8cb Improved safety checks for build-ufd 2018-02-02 16:37:13 -07:00
2Shirt
9feff50913 Added syslinux dependency 2018-02-02 16:34:22 -07:00
2Shirt
44acb9b755
Update windows_setup.py 2018-01-30 17:28:34 -07:00
2Shirt
7bebe745a1
Update build_pe.ps1 2018-01-30 17:10:54 -07:00
2Shirt
96c6997a44 Update function docstrings 2018-01-30 16:50:28 -07:00
2Shirt
89c343943f Replaced remaining show_info calls with show_data 2018-01-30 16:00:59 -07:00
2Shirt
e0db7560e6 Better server share mounting
* Added ability to mount read-only or read-write
  * Allows the same main.py file to be used for all build scripts.
2018-01-30 15:23:46 -07:00
2Shirt
fbf956c651 Finished build-ufd script 2018-01-30 13:33:42 -07:00
2Shirt
16ea653ca4 Removed unused main.py settings 2018-01-28 18:23:59 -07:00
2Shirt
314bc24d09 Removed PuTTY-PSTFP from tools list
* Only used for uploading client info (which was removed)
2018-01-28 18:22:52 -07:00
2Shirt
3ac2d8d1d4 Bugfix: Setting Windows time should work again
* Was using the wrong variable name
2018-01-28 18:19:57 -07:00
2Shirt
012da00821 Removed ClientInfo upload code 2018-01-28 17:55:40 -07:00
2Shirt
c24554720f Add option to upload crash details
* Disabled by default, enabled via main.py ENABLE_UPLOAD_DATA
* Upload destination set via main.py CRASH_SERVER variable
2018-01-28 17:48:42 -07:00
2Shirt
8e05cb0e40 Remove stale AUR packages from cache during build 2018-01-27 15:52:49 -07:00
2Shirt
1cd3571253 Using safer bash config for Build Linux script 2018-01-27 15:19:04 -07:00
2Shirt
3d8af3cb0a Switching to mprime over mprime-bin
* Source url has been broken for a while now
* mprime doesn't take too long to compile
2018-01-27 12:48:11 -07:00
2Shirt
d96256fd87 Add reboot/shutdown entries when not in X 2018-01-27 12:45:37 -07:00
2Shirt
30dcd8758e Added a "Yes to all" option to User Data Transfer 2018-01-26 18:35:05 -07:00
2Shirt
a7451f86ba Added choice() function
* Provides a simlilar interface to the Windows choice command.
2018-01-26 18:32:33 -07:00
2Shirt
f0ae207890 Improved source scanning for user data transfers
* Fixes recursion bug when Windows.old folders are present
* Combined logic for file/folder sources and WIM sources
* Code uses proper folder separators for the running OS
  * (e.g. '\' for Windows and '/' for the rest)
2018-01-26 17:52:43 -07:00
2Shirt
f7f3f0d53c
Updated info.py
Should fix #10
2018-01-17 17:22:45 -07:00
2Shirt
8f4ec41359 Merge branch 'dev' of https://github.com/2Shirt/WizardKit into dev 2018-01-15 19:09:30 -07:00
2Shirt
fbd7f47749 Added build-ufd script
* Includes safety checks to avoid unintentional data loss
2018-01-15 17:30:47 -07:00
2Shirt
5a1f9f0961 Added Cleanup CBS launcher 2018-01-15 14:28:31 -07:00
2Shirt
3bc45e9832 Fix issue #7 by switching to Font Awesome v4 2018-01-15 14:16:59 -07:00
2Shirt
480ac48aae Removed '+' from positive temps in hw-sensors 2018-01-15 14:13:35 -07:00
2Shirt
0e87bf55a0 Enable HW-Diags for more devices
* Skip all removable WizardKit devices
* Fixes issue #8
2018-01-15 13:45:58 -07:00
2Shirt
10cf7a1575 Updated hw-sensors
* Filter out non-temp sensors
* Adjusted formatting
* Partially addresses issue #9
2018-01-15 12:57:27 -07:00
2Shirt
5c21f8569c wimlib was added to the community repo 2018-01-12 16:13:02 -07:00
2Shirt
f3d8daf8e2 Use HTTPS for git clones during build 2018-01-12 16:12:29 -07:00
2Shirt
07f6179dab i3-gaps has been added to the community repo 2018-01-12 15:23:17 -07:00
2Shirt
2cce7c34d6 Fixed copying main.py to settings 2018-01-12 15:22:07 -07:00
2Shirt
41b818ad99 v1.3.1 - Wizard Hat Trick
## Main Kit ##
* Updated several tool versions
* Various bugfixes
  * _(Including another fixed set-eol.ps1 call)_

## Windows PE ##
* Fixed using local Windows sources
* Various bugfixes

## Linux ##
* New build script
  * Better package handling
  * Packages split into build dependencies, aur, and live
  * Isolinux/pxelinux/syslinux/refind setup during build process
* main.py settings has replaced arch.conf and wifi.conf
* Hardware diagnostic scripts
  * All scripts rewritten in Python
  * Prime95
    * Added ablity to abort test without cancelling other tests
    * The tempuratures are saved from the end of the test
  * NVMe/SMART
    * New NVMe tests since SMART support is limited for NVMe devices
    * Progress is displayed for SMART self-tests
    * The script waits on the self-test for the polling-time + 5min
      * Unless it detects completion after 60 seconds
  * badblocks
    * Optionally run when the device health is unknown
      * These overrides are done per-device
  * Results screen
    * Final temps from Prime95 tests displayed
* Tempurature sensors rewritten
  * Rewritten in python
  * Report CoreTemps first then others (CPU temps)
  * Wrap into two columns as necessary (if the window is big enough)
2017-12-30 18:45:55 -07:00
2Shirt
3a8aa66f18 v1.3.0 - Wizard Hat Trick
## Main Kit ##
* Updated several tool versions
* Various bugfixes

## Windows PE ##
* Fixed using local Windows sources
* Various bugfixes

## Linux ##
* New build script
  * Better package handling
  * Packages split into build dependencies, aur, and live
  * Isolinux/pxelinux/syslinux/refind setup during build process
* main.py settings has replaced arch.conf and wifi.conf
* Hardware diagnostic scripts
  * All scripts rewritten in Python
  * Prime95
    * Added ablity to abort test without cancelling other tests
    * The tempuratures are saved from the end of the test
  * NVMe/SMART
    * New NVMe tests since SMART support is limited for NVMe devices
    * Progress is displayed for SMART self-tests
    * The script waits on the self-test for the polling-time + 5min
      * Unless it detects completion after 60 seconds
  * badblocks
    * Optionally run when the device health is unknown
      * These overrides are done per-device
  * Results screen
    * Final temps from Prime95 tests displayed
* Tempurature sensors rewritten
  * Rewritten in python
  * Report CoreTemps first then others (CPU temps)
  * Wrap into two columns as necessary (if the window is big enough)
2017-12-30 17:55:27 -07:00
2Shirt
fb4f7c99eb Updated Build PE.cmd
* Fixed set-eol.ps1 call
2017-12-30 17:06:05 -07:00
2Shirt
ac2bc78ab8 Silly workaround for issue #7 2017-12-30 16:57:59 -07:00
2Shirt
c57c24d245 Forgot a few more $install_dir lines 2017-12-30 15:48:21 -07:00
2Shirt
95bb27c165 Forgot a install_dir line 2017-12-30 15:10:19 -07:00
2Shirt
3ab3e4cd2a Updated README 2017-12-30 12:37:14 -07:00
2Shirt
c7901d1328 Merge branch 'linux' into dev 2017-12-30 12:30:27 -07:00
2Shirt
b70f1bda9a Removed %INSTALL_DIR% code
* Using hardcoded 'arch' in it's place
* The initrd boot variables weren't being set properly
2017-12-30 12:17:30 -07:00
2Shirt
b441738950 Fixed opening logs in WinPE 2017-12-30 12:05:24 -07:00
2Shirt
43e8746c46 Fixed using local Windows images 2017-12-30 12:04:48 -07:00
2Shirt
6eef031ebf
Update build_pe.ps1
FastCopy version bump
2017-12-30 10:51:31 -07:00
2Shirt
19f087cb8b
Update sources.py
IOBit Portable version bump
2017-12-30 09:55:48 -07:00
2Shirt
a2737e3102
Update sources.py
FastCopy version bump
2017-12-30 09:48:56 -07:00
2Shirt
886d9ae8c2 Updated build_additions.txt to use ${install_dir} 2017-12-29 01:33:42 -07:00
2Shirt
0b8670f6ef Copying memtest86 to LIVE_DIR fixed 2017-12-29 01:32:49 -07:00
2Shirt
3c07c5b265 New EFI config 2017-12-28 22:08:58 -07:00
2Shirt
4ab8ea8664 Adjusted syslinux settings 2017-12-28 20:59:51 -07:00
2Shirt
02793b1e73 Added Memtest86 2017-12-28 15:51:19 -07:00
2Shirt
28cda82704 Added more build.sh customizations
* Inserts the contents of build_additons.txt into build.sh right before make_iso
2017-12-28 15:49:18 -07:00
2Shirt
698546f823 Switch to single-line disk descriptions 2017-12-27 19:36:22 -07:00
2Shirt
7092391c47 Set safer defaults for Live Linux (CLI) entries 2017-12-27 19:19:56 -07:00
2Shirt
c0cbdc6923 Added pause after audio and network tests 2017-12-27 19:19:29 -07:00
2Shirt
c4adbd3ac0 Added wimboot and fixed pxe/syslinux backgrounds 2017-12-27 18:59:49 -07:00
2Shirt
cde9953b2a New iso/pxe/syslinux config
* Uses main.py settings for KIT_NAME
* Uses archiso %vars% which are expanded during build.sh
* Pxelinux/Syslinux use backgrounds from Images/
2017-12-27 17:24:58 -07:00
2Shirt
aac9badc4f Reoragnized .linux_items/include
* Removed include/iso items since they've been integrated into the new scripts
* Moved include/live/* to include/ since there's only one "include" folder now
2017-12-27 16:40:34 -07:00
2Shirt
524096165c Forgot to update_progress during badblocks tests 2017-12-27 14:02:04 -07:00
2Shirt
5d70124c39 Updated badblocks section
* Reduced worker pane size
* Save badblocks logs in LogDir
2017-12-27 13:42:10 -07:00
2Shirt
18ce079aa3 Open log after HW diags 2017-12-27 13:11:25 -07:00
2Shirt
346b9f492c Workaround to ensure we switch to X during boot
* It was starting but you'd have to switch to tty2 and back to tty1 to see anything
2017-12-27 12:38:25 -07:00
2Shirt
29f663fd0e Convert main.py from CRLF to LF for BUILD_LINUX 2017-12-27 05:00:26 -07:00
2Shirt
70e1655efe Merge branch 'new-linux-scripts' into linux
* Finished Python rewrite, ready for testing
  * (I think)
2017-12-27 04:53:06 -07:00
2Shirt
938ee7afd5 Renamed mount-all-volumes foh option to gui 2017-12-27 04:50:18 -07:00
2Shirt
094251b93f Forgot to remove python-libtmux package references 2017-12-27 04:47:23 -07:00
2Shirt
6ddf3fca67 Re-added hw-diags quick disk check function 2017-12-27 04:45:59 -07:00
2Shirt
62c77fb696 removed remaining old, unused scripts 2017-12-27 04:27:40 -07:00
2Shirt
16c20ac6ea Cleanup and fix results screen during abort
* Renamed run_smart to run_nvme_smart to match rest of the code
* Mark NVMe/SMART status as NS earlier in a couple more cases
* Prevent crash when all tests are run and then aborted during Prime95
2017-12-27 04:22:02 -07:00
2Shirt
7fbbde56c6 run_badblocks() working
* Re-added and updated hw-diags-badblocks
2017-12-27 04:01:54 -07:00
2Shirt
d4146c9c35 Added warning when no sensors are detected 2017-12-27 03:58:56 -07:00
2Shirt
0ea523a2cf Show Prime95 final temps in result screen 2017-12-27 02:12:32 -07:00
2Shirt
0bab107e24 Updated results screen formatting 2017-12-27 02:11:28 -07:00
2Shirt
24e72f2f35 SMART section finished
* The script waits for the self-test for polling-time+5min
  * Unless it detects completion after 60 seconds
* Fixed missing linebreaks in progress panes
* BREAKING: TESTS data structure reworked to support per-dev status
2017-12-27 01:42:04 -07:00
2Shirt
579a747878 Started work on results screen 2017-12-26 21:43:23 -07:00
2Shirt
a6917fc129 run_mprime() finished
* Results now determined from log files
2017-12-26 15:57:36 -07:00
2Shirt
8ff33547c4 Save temps just before stopping Prime95 2017-12-26 15:16:15 -07:00
2Shirt
c1fe3d8538 Added --nocolor option to hw-sensors
* Going to use it to export the "final" temps before killing Prime95
2017-12-26 15:08:46 -07:00
2Shirt
03d7646685 Enabled logging for hw-diags 2017-12-26 14:17:53 -07:00
2Shirt
74ba8fb758 Added hw-diags-prime95 and still removing libtmux 2017-12-24 18:46:02 -07:00
2Shirt
57b1d246c2 Going to drop libtmux and use tmux directly 2017-12-24 17:13:48 -07:00
2Shirt
6f456f5c47 Added show_disk_details() 2017-12-24 15:41:13 -07:00
2Shirt
59a449e7e5 Cleanup
* Renamed 'Health OK' to 'Quick Health OK'
  * Better implies that we're not done testing
* Renamed SMART sections to NVMe/SMART
  * Dropping SMART short-tests for NVMe drives
2017-12-24 13:19:23 -07:00
2Shirt
87c09c4da0 New method for gathering SMART/NVMe data
* Replaced smartmontools with smartmontool-svn
  * Adds JSON exporting which makes parsing the data easier
* Using nvme-cli for NVMe drives instead of smartctl
  * NVMe support in smartctl is still experimental and inconsistent
* New "Health OK" detection
  * This is used to determine if a disk is okay to be tested
    * e.g. an IDE disk w/out any SMART data now requires explicit overriding
  * NVMe disks are set using the "critical_warning" attribute
  * SMART disks are set using the "overall-health" attribute
2017-12-24 00:21:33 -07:00
2Shirt
8acb493006 typo 2017-12-23 19:53:28 -07:00
2Shirt
a733af679c Forgot to set apple-fans to auto after Prime95 2017-12-23 19:41:09 -07:00
2Shirt
8e26e09fe6 Reordered functions 2017-12-23 19:40:09 -07:00
2Shirt
19d32dda0b Reduce file opens during update_progress() 2017-12-23 19:36:57 -07:00
2Shirt
5d6e138d29 Started hw-diags & hw-diags-inner rewrite 2017-12-23 19:11:50 -07:00
2Shirt
a7606a4b5c Print script names and audio tests output 2017-12-23 14:24:15 -07:00
2Shirt
a1b72c0aeb New hw-diags-network script 2017-12-22 00:45:42 -07:00
2Shirt
1760c030ef New hw-diags-audio script 2017-12-21 23:34:56 -07:00
2Shirt
e19bcf1000 Renamed apple_fans to apple-fans
* Done to match naming scheme
2017-12-21 23:18:52 -07:00
2Shirt
374d4a1c98 Removed old mount-backup-shares script 2017-12-21 23:17:45 -07:00
2Shirt
e96d491285 New mount-backup-shares script 2017-12-21 23:16:50 -07:00
2Shirt
1cfa008b8e New MS Word search script 2017-12-21 22:31:21 -07:00
2Shirt
96ef259b4c New HW sensors script
* Rewritten in python
* Report CoreTemps first then others
* Wrap into two columns as necessary (if the window is big enough)
2017-12-21 17:25:09 -07:00
2Shirt
a84b2dfef6 Thunar no stays open after mount-all-volumes call 2017-12-19 07:06:42 -07:00
2Shirt
a230810dbc Prevent duplicate conky entrie creation on relogin 2017-12-19 05:10:52 -07:00
2Shirt
04656c50b1 Updated dunst config
* Moved notifications to the left of conky
* Restart dunst after 5s
  * Fixes issue where the first notifcation(s) would stay indefinitely
2017-12-19 05:09:27 -07:00
2Shirt
9c04a5dc83 Misc updates 2017-12-18 19:37:49 -07:00
2Shirt
6bbc15d4f1 Updated: mount-all-volumes
* Added switch for foh mode instead of using symlinks
* Updated i3/openbox shortcuts
2017-12-18 03:50:15 -07:00
2Shirt
183ef78ea9 mount-all-volumes rewrite complete
* New print layout
* All inxi calls replaced with findmnt and lsblk
  * Added util-linux to packages/live
2017-12-18 03:36:56 -07:00
2Shirt
8260746d7f Simplified Build scripts for Kit and PE
* If the script doesn't exist when called then an :UnknownError is called
  * Checking if it exists and jumping to an additional error is a bit redundant
  * dandi_set_env check remains to alert the tech WADK is missing
2017-12-18 00:49:25 -07:00
2Shirt
3b0b103590 Added CRLF checks for main.py to build script
* For consistancy between platforms
2017-12-18 00:49:05 -07:00
2Shirt
5ea03da0a4 Converted all python scripts to LF/UNIX 2017-12-18 00:47:47 -07:00
2Shirt
c1e391132b Added CRLF checks for main.py to build scripts
* Some of the source files changed from crlf to lf and I'm not sure when/how
* This is likely overkill but it didn't take long
2017-12-18 00:45:18 -07:00
2Shirt
a33a54c5e6 Started python conversion 2017-12-17 21:22:53 -07:00
2Shirt
1613d767bf Moving away from arch.conf 2017-12-17 18:57:03 -07:00
2Shirt
d71ca1a38b Removed .network_start 2017-12-17 18:22:26 -07:00
2Shirt
ef6dbc197a Updated main settings and timezones 2017-12-17 18:09:14 -07:00
2Shirt
ce48c717eb Updated i3 setup
* nox+i3 boot cmdline supported
  * Pretty sure this isn't going to be used
* Set more windows to default to floating
2017-12-17 16:54:37 -07:00
2Shirt
d3dab9a2ea Added pacinit alias 2017-12-17 16:50:06 -07:00
2Shirt
451b5868a1 Updated services 2017-12-17 16:42:08 -07:00
2Shirt
42f7fa3e7a More NetworkManager fixes 2017-12-17 14:53:55 -07:00
2Shirt
11eb66c81d Disabled LFS
* Release zip files contain LFS pointers instead of the real files
* Images/* will now be full files again
2017-12-17 14:27:56 -07:00
2Shirt
144e94b31a Readded openbox theme 2017-12-17 13:26:16 -07:00
2Shirt
0b21331747 Bugfix: NetworkManager autostarts again 2017-12-17 13:19:04 -07:00
2Shirt
e8e3d09731 Bugfix: locale generation should work again 2017-12-17 13:15:31 -07:00
2Shirt
81df06fd8b Added usage prompt and renamed functions 2017-12-17 12:47:13 -07:00
2Shirt
94d26902dc Set folder permissions before building
* Prevents issues when using GitHub zip archives
2017-12-17 12:05:41 -07:00
2Shirt
daa19626a6 Fixed lean.zsh-theme download/install 2017-12-17 11:50:46 -07:00
2Shirt
4abea24310 Avoid loading settings twice 2017-12-17 11:15:42 -07:00
2Shirt
cc2e42d348 Bugfix: autologin 2017-12-13 18:01:58 -07:00
2Shirt
c159602a70 Download mirrorlist during build 2017-12-13 13:20:43 -07:00
2Shirt
e37b1529b0 Removed customize_airootfs.sh and new SSH code
* Code has been merged into Build Linux
  * (releng copy is updated in place)
* SSH key for wktech now generated at build time
* Hostname is now set using main.py
* Passwords are now set using main.py
* Timezone is now set using main.py
2017-12-13 13:11:28 -07:00
2Shirt
f97028bbdd Updated Build Linux
* More consistant variable names
* Ensure that main.py is read for build-arch and copy-archiso
* Bugfix: typo in build.sh call
2017-12-13 10:58:26 -08:00
2Shirt
c780a03361 Fixed .linux_items permissions 2017-12-13 10:56:13 -08:00
2Shirt
58e968467b Removed conflicting pacman.conf 2017-12-13 10:55:58 -08:00
2Shirt
957e1a2d77 Use Images/Linux.png as wallpaper 2017-12-13 10:02:47 -08:00
2Shirt
faffd66d09 Further trimmed .linux_items
* oh-my-zsh is now downloaded during update_archiso
  * (Including the lean theme)
* packages.both removed
  * It's now built during update_archiso
2017-12-12 15:02:25 -08:00
2Shirt
708ffe1157 Update airootfs from releng
Idea:
* Remove unwanted files
* Modify / Replace wanted files
* Add additional files
2017-12-12 12:27:47 -08:00
2Shirt
a8033f0a02 .linux_items cleanup 2017-12-12 12:21:20 -08:00
2Shirt
b9e5f1921f Reorganized include folders
* include/live is "burned" into the sfs files during build-arch
* include/iso is added to the iso folder before iso creation
* Added --copy-archiso flag to Build Linux
2017-12-12 11:34:05 -08:00
2Shirt
87e651cb07 Better package list handling 2017-12-12 11:18:15 -08:00
2Shirt
2af3e552d4 Updated Build Linux script
* Uses main.py settings for branding
* Use current user instead of "builduser"
* Better elevation handling
2017-12-12 10:39:49 -08:00
2Shirt
2c5d0faae0 Still working on the new build script 2017-12-11 23:37:12 -08:00
2Shirt
3b0b6f32c2 Started new Linux build script
* Not done yet
2017-12-11 21:36:31 -08:00
2Shirt
4d42fac799 Updated README.md 2017-12-06 19:56:06 -08:00
2Shirt
94ce0e50f0 Added Linux images 2017-12-06 19:55:32 -08:00
2Shirt
5fbc888343 Merge live Linux into main project 2017-12-06 19:54:57 -08:00
Alan Mason
8b56ca30a2 Setup LFS 2017-12-06 19:46:23 -08:00
Alan Mason
40a432786d Prep for merge into main project 2017-12-06 18:10:39 -08:00
Alan Mason
2c40aedbba 2017-10: Retroactive Updates
Multiple desktop environments
* (Default) Openbox/tint2/conky
* (Alt)     i3-gaps/i3status

* Added i3 cmdline switch to use i3-gaps instead of openbox
* Added IP status to conky
* Added hfsprogs (again)

* New themes for dunst, ls, rofi, urxvt
  * ls colors make NTFS mod 777 folders readable

* Disabled screen blanking (again)
  * Didn't disable DPMS before
* Fix SSH key permissions
2017-12-06 17:59:51 -08:00
Alan Mason
542d584b4a 2017-08: Retroactive Updates
Switched to i3/dunst/rofi over xfce4

* Custom Repo overhaul
  * build-wk downloads, builds, and adds packages to the custom-repo
  * Dropped i686 support
* HW-Diag scripts should now "support" virtual drives
  * e.g. /dev/vda (for easier testing)
* Bugfix: removed resolv.conf symlink to fix NetworkManager
2017-12-06 17:58:58 -08:00
Alan Mason
077401ef85 2017-06: Retroactive Updates
* Include extras/* in ISO
  * build-wk modifies build.sh before it is called
* NetworkManager is back
* Switched to Numix-Square icons
* Added remount-rw script
  * Accessible in Thunar as custom action
* Readded mesa-demos to fix inxi message
* Removed xorg-video-ati (conflicts with AMDGPU)
* Swapping nvidia in for nouveau (attempt to fix X for newer macs)
* Added mbpfan-git
* Added Mac fans script (set all fans to auto/max)
* Fixed issue where udevil would use /media/$USER/Name for the first call
2017-12-06 17:58:25 -08:00
Alan Mason
18e9e0b332 2017-04: Retroactive Updates
* Updated drive detection to support NVMe drives (SMART and badblocks)
* Misc cleanup
2017-12-06 17:57:27 -08:00
Alan Mason
1297501714 2017-02: Retroactive Updates
* Switched to Firefox
  * Midori was crashing too often
* Rewrote the wallpaper code
  * Should fix issue where no wallpaper was shown if running from UFD
* The pacman mirrorlist is now a static list.
  * This needs manually updated at build-time

Cleanup
  * Disabled console screen blanking
  * Fixed typo preventing aliases from loading correctly
  * mount-all-volumes now removes /media/hhtech properly
  * Removed leftover netctl files
  * Removed leftover nodm

BREAKING: Moved config files back inside UFD/arch instead of UFD/config
2017-12-06 17:56:57 -08:00
Alan Mason
d8952ed26f 2017-01: Retroactive Updates
* Disabled gputest
  * The package is failing to install.

* Now using Midori GTK3 build
  * GTK2 was pulled from main repos for security reasons

* Removed warnings about missing UFD
  * For use with live sessions

* Wallpaper updated for live sessions
  * Wallpaper is now set at startup
  * Checks for UFD source but defaults to included file
  * Bugfix: Wallpaper is now set for multiple monitor/workspace setups

* Disabled choose-mirror service

* Better permission handling
  * build-wk now checks if running as root
  * build-wk now sets permissions before calling build.sh
    * Should prevent build failues as build.sh expects files to be owned by root
    * build-wk sets ownership back to builduser.builduser during cleanup

* Better menu for HW-Diags
  * The script now returns to the menu after running a selection
    * Unless the mode was set directly by passing a valid argument
    * NOTE: This allows for easier use in CLI mode

* Add delay before removing /media/wktech

* Adjusted TMP_DIR in build-wk

* Fixed path to custom repo

* Trimming the fat
  * hostname / hosts now configured by customize_airootfs.sh
  * removed files from etc that were at default settings
  * removed grml zsh config since oh-my-zsh/lean is used

* Defined a LOG_DIR for build-wk

* Introducing libinput
  * Switched to libinput over synaptics as it has been deprecated.
    * Should restore touchpad functionality going forward.
* Full mount path SHOULD now be displayed for mount-all-volumes.

* Added CLI Screensavers

* diag-network works now
  * network connection tests now passes all ipv4 private ip ranges
    * 10.0.0.0/8, 172.16.0.0/12, & 192.168.0.0/24
    * need to add ipv6 at some point
  * hw-diag menu flow adjusted

* New hostname and more bugfixes
  * hostname switched to wk-arch
  * ufw package is now installed
  * adjusted upload section of hw-diags

* Added alias for start-wifi

* Booting to CLI mode will autologin wktech
  * When booting to the CLI the motd shows some avail commands
  * Adjusted HW-Diags menu for use in CLI mode
2017-12-06 17:56:10 -08:00
Alan Mason
a83c28ca3b 2016-11: Retroactive Updates
* Enabling SSHD
2017-12-06 17:55:06 -08:00
Alan Mason
3e57a6fb9e 2016-10: Retroactive Updates
* Added wimlib
2017-12-06 17:54:34 -08:00
Alan Mason
3bf0f54b1a 2016-09: Retroactive Updates
* Display Manager
  * nodm removed due to a dbus issue
    * Hopefully if Xorg can’t be run it will default to CLI
  * XFCE is now started by .zlogin
    * Removed the "Save Session" checkbox

* Networking
  * Replaced NetworkManager with systemd-networkd
    * networkd had a 33% faster boot time than NetworkManager (-10s)
    * It also more directly prioritizes wired connections
    * NOTES: This removed the ability to easily connect to new networks
      * This is okay as the WiFi changes very infrequently
      * The WiFi settings are loaded from the UFD directly
  * Added linux-firmware to support more network devices
  * broadcom-wl wouldn't compile under i686 so it's x64 only ATM
  * Removed the udev rule forcing the dhcp delay during boot
  * Server IPs updated

* Config files and wallpapers moved to <UFD>/config

* Fixed an issue where SMART was misreporting drives as bad
  * When a drive failed SMART, subsequent drives would always report "NS"
2017-12-06 17:53:59 -08:00
Alan Mason
f67cd37a38 2016-08: Retroactive Updates
* Added arch.conf file which is loaded from the UFD
  * Allows configuration without rebuilding the ISO
* Added connect-to-network script that uses arch.conf
  * Available for manual execution from the command line
  * Used by mount-backup-shares
* Added hardinfo with Conky hint and keyboard shortcut (Super+i)
* Avoid deleting a newly created iso right after building
* Conky
  * Settings can now be stored on the UFD
  * Transparancy fixed
* mount-all-volumes doesn't print the mountpoint for ARCH_HH
* NetworkManager should no longer hold up the boot time
* Prime95
  * Adjusted default length due to the summer heat
  * Fixed bug where hw-diags would let it run forever
* Removed extra themes to try and reduce the overall size
* Switching to nodm over lightdm
2017-12-06 17:52:21 -08:00
Alan Mason
8e36a24f37 2016-06: Retroactive Updates
* Added HW-Sensors alias and keyboard shortcut
* Added new packages to packages.both (from 2016.06 archiso update)
* Disabled gputests for i686 builds
* Errors would cause an incomplete line to be left in the log causing a false-positive
* HW-Diags will no longer upload results if the Ticket# starts with '0'
  * Added chmod flags to the rsync upload
* Initial work to add custom-repos
* Open GUI progs without entering a password (e.g. GParted)
* The wallpaper should now be loaded from the UFD.
  * Still need to move scripts or add a "settings" file
* mount-all-volumes now shows the mount-points while mounting (like running manually)
* photorec-sort 7z archive testing is currently stalling, disabled for now
2017-12-06 17:49:18 -08:00
Alan Mason
546a654c0f 2016-05: Retroactive Updates
* Added build-wk script
  * This will (hopefully) keep the arch-hh folder clean allowing for a better git workflow
* Rebuilt the default settings for wktech for most programs
* Made the theme/icons more consistant between programs
* Changed whiskermenu to more closely match a Windows Start Menu
* Lots of hw-diags updates:
  * Connects to the network automatically
  * Copies all results files to $HOME/Tickets
  * Creates valid tgz archives of the results
  * Uses `mktemp` for setting TMP_DIR
* mount-all-drives now opens the FileManager if lauched w/ Super+M
* Probably more...
2017-12-06 17:47:06 -08:00
Alan Mason
10a70e5192 2016-04: Retroactive Updates
* Added HFS+ to udevil's allowed types.
* Added mediainfo to meet photorec-sort requirements
* Removed git
* Switched out Chromium for Midori
  * Size reduction test
* hw-diags now tests USB drives (except ARCH drives)
* mount-all-volumes no longer opens the file browser

Bugfix: mount-backup-shares should now work.
2017-12-06 17:44:12 -08:00
Alan Mason
d37e453643 2016-03: Retroactive initial commit 2017-12-06 17:42:25 -08:00
Alan Mason
b077602a42 v1.2.2 - WizardHats
More UTF-8
2017-12-06 13:31:09 -08:00
Alan Mason
6ff8d76b59 Write logs in UTF-8
Fixes #6
2017-12-06 13:23:28 -08:00
Alan Mason
5d7cad37e4 Bugfix: Prevent crash when checking Office/QuickBooks network installers 2017-12-06 12:50:34 -08:00
Alan Mason
ac1e839876 Merge branch 'master' into develop 2017-12-04 15:17:45 -08:00
Alan Mason
2fd5dd28d9 Removed compress_bin.cmd
No longer used
2017-12-04 15:14:19 -08:00
2Shirt
a6b74ce3d0
v1.2.1 - WizardHats
Updated README.md

* Always forget something
2017-12-04 15:07:40 -08:00
Alan Mason
50c70c3ab9 v1.2.0 - WizardHats
## Main Kit ##
* Updated build script to work with new folder layout
* Browser sections have better profile & installation detection/reporting
* Browser extension section updated to support Firefox Quantum
* User Data Transfers will display local sources before remote sources
* Various bugfixes

## Windows PE ##
* WizardKit PE has been integrated into this project
* The build script has been replaced with a new PowerShell script
  * This downloads the tools, builds a new PE image, and exports x32 & x64 ISOs
  * main.py is opened for editing before the PE images are built
  * ISO names use KIT_NAME_SHORT (e.g. WK-WinPE-20XX-XX-XX-amd64.iso)
* BitLocker CLI tool "manage-bde" has been added
* All PE Python scripts have been updated
  * These scripts also use the main.py file for customization
  * Better handling of damaged drives during backup & setup sections
  * Partition type descriptions have been trimmed to fit on a single line
  * Backup and Setup sections are now logged
    * These logs can be reviewed and saved before returning to the main menu
  * "No disk" errors seen when scanning empty card-readers should be silenced
* Various bugfixes
2017-12-04 14:57:30 -08:00
Alan Mason
1aed752be0 build_pe.ps1 now uses main.py settings
* main.py is copied to BUILD and then opened in notepad for editing
* ISO names use KIT_NAME_SHORT
2017-12-04 14:50:03 -08:00
Alan Mason
a5a4278c3e Expanded browser section
* Support installing adblock for browsers with no profiles detected
* Warn tech about missing browsers if profiles are detected
2017-12-04 12:19:57 -08:00
Alan Mason
4130932d58 Install extensions after Ninite bundle
This prevents the Ninite Firefox install from wiping out the FF extension(s)
2017-12-04 11:44:27 -08:00
Alan Mason
d0b7d116c5 Disabled process killer 2017-12-04 10:04:07 -08:00
Alan Mason
affa8b5af8 version bump 2017-12-04 09:11:02 -08:00
Alan Mason
abd41f3c94 Updated url for Lenovo Support 2017-12-04 09:06:24 -08:00
Alan Mason
1cbd1782f7 User data transfers working.
Bugfix: cleanup_transfer() call was missing dest_path
2017-12-04 08:46:19 -08:00
Alan Mason
26c1a47fec Sorted data transfer sources for menu_select 2017-12-04 08:20:11 -08:00
Alan Mason
b0068e0dce Bugfix: browsers.py
* Profile backup detection fixed
2017-12-04 07:43:53 -08:00
Alan Mason
d78971019f Bugfix: install_firefox_extensions() 2017-12-04 07:35:31 -08:00
Alan Mason
d737a35078 Refactored check_os()
* Safer registry queries
* Only query CurrentBuild, CurrentVersion, and ProductName
* Service Pack / update status determined by the build number
* Set build & version to -1 instead of 'Unknown' if str to int/float fails
  * Might prevent crashes by not mixing str/num types
2017-12-04 07:13:37 -08:00
Alan Mason
355b6deb7d Bugfix: init_client_dir.cmd
%iso_date% was being referenced before being set
2017-12-04 05:55:56 -08:00
Alan Mason
f1c07ae252 Update ERUNT launcher to use Backups instead of Info 2017-12-03 22:19:48 -08:00
Alan Mason
80bf1fe3c2 Bugfix: system_checklist.py activation section 2017-12-03 22:19:36 -08:00
Alan Mason
110084fce6 Added FirefoxExtensions to update.py 2017-12-03 19:54:44 -08:00
Alan Mason
9414c04395 Pause during abort() 2017-12-03 18:02:32 -08:00
Alan Mason
96515bd2b8 Bugfix: system_diagnostics.py
Respect ENABLED_UPLOAD_DATA value
2017-12-03 17:46:45 -08:00
Alan Mason
45dc982f44 Don't copy SDIO or Update Kit.cmd 2017-12-03 17:45:18 -08:00
Alan Mason
09b23c2ffa Prevent double timestamps in show_installed_ram() 2017-12-03 17:36:02 -08:00
Alan Mason
83074f7460 Registry backups saved to Backups instead of Info 2017-12-03 17:35:25 -08:00
Alan Mason
9193c16090 Bugfix: activation.py
Reversed updates from commit b47c214
2017-12-03 14:57:34 -08:00
Alan Mason
3b31b7fd29 Bugfix: update.py 2017-12-03 14:52:51 -08:00
Alan Mason
197b695fac Bugfix: Copy WizardKit.cmd
* I'm sure I've fixed this before..
2017-12-03 13:06:42 -08:00
Alan Mason
c2df5835b5 Avoid copying WinPE folders during Build Kit.cmd 2017-12-03 10:55:54 -08:00
Alan Mason
975a43f1d5 Ask to open logs in WinPE menus
* Instead of automatically opening them
2017-12-03 09:50:30 -08:00
Alan Mason
5c5b13b33c Updated select_minidump_path() 2017-12-03 09:49:42 -08:00
Alan Mason
e892cd3406 Attempt to silence more "No disk" errors 2017-12-03 09:48:59 -08:00
Alan Mason
1848c7dc66 Fix rare crashes caused by damaged disks 2017-12-03 09:28:12 -08:00
Alan Mason
7e4a0259c7 updated partition_uids sections 2017-12-03 09:08:50 -08:00
Alan Mason
075e25462e Properly handle damaged filesystems 2017-12-02 16:58:45 -08:00
Alan Mason
da0dae2083 Trimmed partition descriptions 2017-12-02 16:33:26 -08:00
Alan Mason
9ac25dbab0 Updated Build Kit.cmd
* Use OUT_KIT instead of OUT to match Build PE's OUT_PE
2017-12-01 19:53:43 -08:00
Alan Mason
750112cfb2 WinPE files moved into place. 2017-12-01 19:43:42 -08:00
Alan Mason
ef9775273c Merging WizardKit PE into main project 2017-12-01 19:33:21 -08:00
Alan Mason
adbfa038b6 Cowardly moving WinPE out of the way 2017-12-01 19:32:27 -08:00
Alan Mason
b6cc250892 Added Images folder to PE 2017-12-01 19:30:14 -08:00
Alan Mason
e13b057eac Sync functions\* with WinPE versions 2017-12-01 19:24:09 -08:00
Alan Mason
d8c625d2ad Reorganized root folder
* .root_items --> .kit_items
* ConEmu.png --> Images\ConEmu.png
2017-12-01 19:14:56 -08:00
Alan Mason
7a13a15514 Bugfix: bcdboot (again) 2017-12-01 18:39:02 -08:00
Alan Mason
c52681be05 Bugfix: wimlib sections 2017-12-01 18:31:06 -08:00
Alan Mason
ffa2abb2b4 Adjusted partition info display 2017-12-01 17:13:20 -08:00
Alan Mason
541660484b Bugfixes for backup sections
** Still broken though
2017-12-01 17:12:27 -08:00
Alan Mason
20a730c6e7 Bugfix: bcdboot
Need to use WinPE's copy instead of local
* Win7 version doesn't have the /f option
2017-12-01 15:48:00 -08:00
Alan Mason
19176d30cf Open logs and cleanup 2017-12-01 15:46:58 -08:00
Alan Mason
dce31bf5dd Windows Setup working 2017-12-01 15:28:15 -08:00
Alan Mason
d075f17bfa Added run_diskpart(script)
* Takes list, writes script, runs script, and returns result
2017-12-01 15:27:10 -08:00
Alan Mason
a9822ae9bd Bugfix Tool paths 2017-12-01 13:31:42 -08:00
Alan Mason
8d729d9066 Bugfix: find_windows_image() 2017-12-01 13:16:21 -08:00
Alan Mason
5e5d5834d9 Bugfix: PE_TOOLS paths 2017-12-01 13:15:56 -08:00
Alan Mason
5dc7b72c61 Merge branch 'python-overhaul' into dev
# Conflicts:
#	.bin/Scripts/functions/common.py
#	.bin/Scripts/functions/disk.py
#	.bin/Scripts/functions/windows_setup.py
#	.bin/Scripts/functions/winpe_menus.py
#	.bin/Scripts/winpe_root_menu.py
2017-12-01 12:48:09 -08:00
Alan Mason
f608e9b88c Show title before getting ticket_number 2017-12-01 12:42:46 -08:00
Alan Mason
56c3960451 Bugfix: menu_setup() 2017-12-01 12:42:23 -08:00
Alan Mason
a6f9518648 Bugfix: find_windows_image() 2017-12-01 12:41:39 -08:00
Alan Mason
5d32f3c94a Bugfix: Abort logic 2017-12-01 12:27:53 -08:00
Alan Mason
97e93e812b Bugfix: partition_uids import 2017-12-01 12:27:26 -08:00
Alan Mason
06affc3bd1 Bugfix: menu_tools() 2017-12-01 12:26:37 -08:00
Alan Mason
ab6fd19c02 Bugfix: menu_select() 2017-12-01 12:26:11 -08:00
Alan Mason
5aab8a98e3 Bugfix: Was trying to use 'Env' before it was set. 2017-12-01 12:24:11 -08:00
Alan Mason
cd3f3ed8d3 Always more cleanup 2017-12-01 12:02:05 -08:00
Alan Mason
387b1740e4 Enabled DISM logging 2017-12-01 11:57:56 -08:00
Alan Mason
46582c1833 Bugfix: Forgot I renamed/replaced menu.py 2017-12-01 11:57:38 -08:00
Alan Mason
1b00c1c9a3 New folder layout
* Main ideas
  * Match WizardKit layout
  * Keep original folders clean

* Build work is now done in $Root\BUILD
* $Temp is now set to $Root\BUILD\Temp
* New iso files are put in $Root\OUT_PE
2017-12-01 11:47:12 -08:00
Alan Mason
1b84b1dd91 Merge branch 'python-overhaul' into dev 2017-12-01 11:09:11 -08:00
Alan Mason
90c4189942 Updated winpe_menus.py & cleanup
* Removed "Windows Family" logic
  * Win7 will now have recovery tools setup
* Added format_disk()
2017-12-01 11:05:40 -08:00
Alan Mason
deb7c76ffb windows_setup.py done 2017-12-01 10:12:59 -08:00
Alan Mason
33924c183e Updated find_windows_image() & setup_windows()
* Merged File and Ext dict entries
* Using psutil instead of mountvol
2017-12-01 09:59:19 -08:00
Alan Mason
c09d7ab603 updated functions\backup.py 2017-11-30 23:06:41 -08:00
Alan Mason
c951380482 functions\disk.py done 2017-11-30 23:06:23 -08:00
Alan Mason
a0460d6a82 updated select_disk() 2017-11-30 22:35:16 -08:00
Alan Mason
6903078ee0 updated prep_disk_for_formatting() 2017-11-30 22:19:31 -08:00
Alan Mason
fbedd79aa3 updated scan_disks()
* Renamed from get_attached_disk_info()
2017-11-30 22:10:45 -08:00
Alan Mason
e9ff02375f More letter updates 2017-11-30 21:52:51 -08:00
Alan Mason
b47c214133 More misc cleanup 2017-11-30 21:48:25 -08:00
Alan Mason
deb1e8f4fd Volume letter updates
* Added reassign_letter()
  * Attempts to reassign a volume to better ensure predictable letters
  * i.e. Local Windows source volume letter == 'I'
* Adjusted code to avoid the "hidden" assign_volume_letters() call in select_disk()
2017-11-30 21:33:55 -08:00
Alan Mason
4ed6d41d10 Updated menu / title sections
* Added set_title() which sets window title and global_vars['Title']
* menu_select() will now display global_vars['Title'] above title
  * (If it exists)
  * Bugfix: fixed a few bad calls of menu_select()
2017-11-30 21:08:52 -08:00
Alan Mason
850a1fca73 updated menu_backup() 2017-11-30 20:31:46 -08:00
Alan Mason
b96e5f3be6 updated verify_wim_backup() 2017-11-30 20:31:37 -08:00
Alan Mason
7133089d31 updated select_backup_destination() 2017-11-30 20:03:19 -08:00
Alan Mason
c043c3398d Reordered functions 2017-11-30 19:56:42 -08:00
Alan Mason
67f08c5042 updated prep_disk_for_backup()
* Partition['Image Path'] is set to the full destination path
  * (i.e. ['Image Path'] + '\\' + ['Image File']
  * Partition['Image File'] variable has been removed
* Simplified ['Backup Warnings'] section
* Added fix_path()
  * Replaces unsupported characters/strings with underscores
2017-11-30 19:45:59 -08:00
Alan Mason
45f0b4d2b1 updated backup_partition() 2017-11-30 17:17:00 -08:00
Alan Mason
b0db11cb4a Added wimlib-imagex
Woops, it's been missing for a bit..
2017-11-30 16:50:14 -08:00
Alan Mason
80cb9b8cea Function separation done.
* Split backup.py into disk & backup
  * disk.py is for lower level disk management
* Renamed functions\data.py's select_disk() to select_volume()
  * Avoid name collision with functions\disk.py's select_disk()
*
2017-11-30 16:40:40 -08:00
Alan Mason
9a3234c822 Simplified Windows share sections 2017-11-30 16:07:51 -08:00
Alan Mason
520cc4bca0 Merge branch 'dev' into python-overhaul 2017-11-30 16:00:27 -08:00
Alan Mason
d54c9da56f Set Notepad++ default font 2017-11-30 15:58:47 -08:00
Alan Mason
b5b03e4dfe Fixed notepad replacement 2017-11-30 15:19:43 -08:00
Alan Mason
a249cdeb7e Adjusted Notepad++ settings 2017-11-30 14:41:29 -08:00
Alan Mason
e136283a71 Added clear_screen() 2017-11-30 14:40:44 -08:00
Alan Mason
11cf75d4a6 Added clear_screen() 2017-11-30 14:08:12 -08:00
Alan Mason
dd20cdd36e Renamed X:\WK to X:\.bin
* Allows functions\common.py to be used as-is
2017-11-30 13:40:22 -08:00
Alan Mason
446867b611 Started Python refactoring
# Plan
* Use current WizardKit scripts as the new base
* Split functions into multiple files under Scripts\functions\
* Review menus and menu-flow
* Log everything and open log at end of menu-flows
  * (before returning to the root/main menu)
2017-11-30 13:39:00 -08:00
Alan Mason
5eaefb3e41 Misc cleanup 2017-11-30 13:34:39 -08:00
Alan Mason
c0d80e8727 Updated error message 2017-11-30 09:59:00 -08:00
Alan Mason
7c7008bdda Merge branch 'add-update-tools' into dev 2017-11-28 17:51:12 -08:00
Alan Mason
b689c33c96 Bugfix: Updating over current tools is working 2017-11-28 17:49:32 -08:00
Alan Mason
3e63a50f92 Drivers and Killer Drivers
* Add-WindowsDriver section to include extra drivers in WinPE
* Added Killer Network Driver to the download list
* Bugfix: $Drivers was not set properly
2017-11-28 17:48:52 -08:00
Alan Mason
cf69505c3f Merge branch 'add-update-tools' into dev 2017-11-28 14:59:45 -08:00
Alan Mason
7a58e6e859 Simplified tool downloads 2017-11-28 14:42:42 -08:00
Alan Mason
330b24641f Bugfix: REG_EXPAND_SZ keys now handled correctly 2017-11-28 14:40:43 -08:00
Alan Mason
675ff57f66 Simplified WinPE package installation 2017-11-28 14:39:33 -08:00
Alan Mason
c4ea4fcd24 Script can now download the tools 2017-11-28 02:10:49 -08:00
Alan Mason
bc33a7fcb3 Disable notepad replacement for now 2017-11-28 01:56:27 -08:00
Alan Mason
7ad26a6182 Fix Q-Dir extraction 2017-11-28 01:55:55 -08:00
Alan Mason
7048696367 Added the rest of the tools 2017-11-28 01:16:40 -08:00
Alan Mason
15c9839bec Added update section
* Needs testing
2017-11-27 23:42:15 -08:00
Alan Mason
a027c61d54 Notepad++ version bump 2017-11-27 23:27:02 -08:00
Alan Mason
c9642cb030 v1.1.0 - WizardHat Edition
* Added download progress for PowerShell build phase
2017-11-27 23:11:43 -08:00
Alan Mason
5d588f3563 PowerShell cleanup
* Show download progress again
  * Done by leaving $progressPreference set to system default
* If there are errors during download, then bail before extracting data
* Moving to a new style guide for PowerShell scripts
  * Using this: https://poshcode.gitbooks.io/powershell-practice-and-style/
  * Encoding set to UTF-8 BOM instead of UTF-8
2017-11-27 22:58:17 -08:00
Alan Mason
8a438dce78 Added "Build PE.cmd" & "build_pe.ps1"
* Removed "make.cmd" since the above replace it
* Merged WK folders into a single _include folder
  * This is copied into place for both amd64 and x86
* Using a new method to replace notepad with Notepad++
2017-11-27 20:47:45 -08:00
Alan Mason
97319df29e Updated .gitignore 2017-11-27 20:42:44 -08:00
Alan Mason
e1536850a6 Removed make.cmd 2017-11-27 20:41:53 -08:00
Alan Mason
3ca0ab2079 Added WinPE.jpg 2017-11-27 20:24:17 -08:00
Alan Mason
613f4eee37 build_pe.ps1 updated and working 2017-11-27 20:24:04 -08:00
Alan Mason
23b7dc89ca Updated build_pe.ps1 2017-11-27 18:09:30 -08:00
Alan Mason
44514b2fef Initial PowerShell rewrite done. 2017-11-27 17:04:24 -08:00
Alan Mason
7b12a8ca91 Merged tool settings
Extra files for the tools are now stored in WK\_include and copied into place during the build.
2017-11-27 16:03:51 -08:00
Alan Mason
fa950f3565 Dropped support for PowerShell 6.0 on Windows 7
The build script will now abort and display a warning in this scenario
2017-11-27 13:32:00 -08:00
Alan Mason
e7dd6a1b54 PowerShell 6 on Win7 failed to build
Start-Process "" -Wait doesn't wait preventing proper extraction of tools.
See these issues:
* https://github.com/PowerShell/PowerShell/issues/2091  (Main issue)
* https://github.com/PowerShell/PowerShell/issues/3747
* https://github.com/PowerShell/PowerShell/pull/4463
2017-11-27 13:29:06 -08:00
Alan Mason
0c5912d345 Enable debug mode in PowerShell via %DEBUG% 2017-11-27 11:23:27 -08:00
Alan Mason
87ac27b5cc Moving to a new style guide for PowerShell scripts
Using this: https://poshcode.gitbooks.io/powershell-practice-and-style/
2017-11-26 14:42:27 -08:00
Alan Mason
1e41954f62 Added Build PE.cmd launch script
* Checks for elevation and relaunches script if necessary
* Checks for WADK installation and loads DandISetEnv.bat
  * This sets the proper variables
* Runs PowerShell in the same window to preserve DandI vars
2017-11-26 14:15:09 -08:00
Alan Mason
546dc77f03 v1.0.1 - WizardHat 2017-11-25 16:33:53 -08:00
Alan Mason
7a1616c8a7 Updated build_kit.ps1 2017-11-25 16:32:07 -08:00
Alan Mason
537973fa90 v1.0.0 - WizardHat
## Major Update ##

* Build Kit.cmd
  * This script will build a fully functional kit requiring only PowerShell 3.0+ be installed prior.
* All launchers are now generated during builds and updates (by update_kit.py)
  * This allows for a much leaner code-base to manage
* Lots of bugfixes, cleanup, and other adjustments.
2017-11-23 20:45:15 -08:00
Alan Mason
d64dcca07d Updated README 2017-11-23 20:21:12 -08:00
Alan Mason
0b4b7a2bbb Saved the update to the wrong file.. 2017-11-23 20:21:01 -08:00
Alan Mason
d8d105c9ae Set core.autocrlf to false
* This should (hopefully) allow for tagged releases to have the correct line endings.
2017-11-23 15:24:53 -08:00
Alan Mason
964ec1e037 Adjusted free_space formatting 2017-11-23 15:13:33 -08:00
Alan Mason
b1fa59c32d Adjusted Activation menu
* If CS: exit_ecript(), else return to menu
2017-11-23 14:55:27 -08:00
Alan Mason
b02a62a917 Updated BIOS activation sections 2017-11-23 14:35:32 -08:00
Alan Mason
dcd5fa1b7a Added VCRedist install script and launcher 2017-11-23 13:54:04 -08:00
Alan Mason
9ba9ece589 Removing Visual C++ 2015 runtimes
* VCRedist 2017 installs as an update for 2015 (http://disq.us/p/1hjcta0)
  * This prevents installing or uninstalling the 2015 versions after installing 2017
  * (Because both 2015 and 2017 use these regkeys: HKEY_LOCAL_MACHINE(Wow6432Node|)\SOFTWARE\Microsoft\DevDiv\VC\Servicing\14.0)
2017-11-23 13:43:49 -08:00
Alan Mason
5dda9ea491 FIx BleachBit sections 2017-11-23 12:20:39 -08:00
Alan Mason
70c0868a4c Misc fixes 2017-11-23 12:20:06 -08:00
Alan Mason
0dc01f48cb Updated Notepad++ settings 2017-11-22 22:37:49 -08:00
Alan Mason
db55a6f2f1 Merge branch 'new-update-script' into develop 2017-11-22 22:16:47 -08:00
Alan Mason
2023ac959b Added ConEmu.png
* Placed in the root diretory for easy swapping before building the kit
* Build Kit.cmd copies the file into place
2017-11-22 22:16:30 -08:00
Alan Mason
e711258850 Updated SafeMode Enter & Exit scripts 2017-11-22 21:02:36 -08:00
Alan Mason
98b95cbcb5 Merge branch 'new-update-script' into develop 2017-11-22 20:58:59 -08:00
Alan Mason
9977ddf365 Made Ninite optional in install_sw_bundle 2017-11-22 20:58:42 -08:00
Alan Mason
6250ee8865 Copy Ninite files to Installers during update 2017-11-22 20:56:26 -08:00
Alan Mason
38cb129add Added confirmation to cbs_fix.py 2017-11-22 20:11:31 -08:00
Alan Mason
68aed8ff34 Fixed menus shown by select_disk()
* Also auto-selects the first disk (if it's the only one detected)
2017-11-22 20:11:07 -08:00
Alan Mason
2ddb878b54 Added confirmation to sfc_scan.py
* Should help avoiding undesired scans
2017-11-22 20:06:56 -08:00
Alan Mason
0416f83448 Fixed broken menus 2017-11-22 20:06:08 -08:00
Alan Mason
c78172ede0 Print script titles to start Python scripts 2017-11-22 19:34:17 -08:00
Alan Mason
62b338ac0a Adjusted BlueScreenView launcher 2017-11-22 19:07:57 -08:00
Alan Mason
3be83e1d0a Merge branch 'refactor-launch-cmd' into develop 2017-11-22 19:06:48 -08:00
Alan Mason
1c0b8b6b19 Bugfix: LaunchOfficeSetup
* Forgot to update %OFFICE_SERVER% to %OFFICE_SERVER_IP%
2017-11-22 19:05:55 -08:00
Alan Mason
76a1752454 Merge branch 'develop' into refactor-launch-cmd 2017-11-22 16:48:52 -08:00
Alan Mason
1011fef0ce Missing update to update.py 2017-11-22 16:47:55 -08:00
Alan Mason
48e4e70155 Updated usage message 2017-11-22 16:46:14 -08:00
Alan Mason
c4b768e114 Merged Console and Program sections
* BREAKING: This uses a new L_TYPE: Executable
  * Added new L__CLI variable to run inside ConEmu
2017-11-22 16:45:11 -08:00
Alan Mason
19f744f8f8 Avoid double pause in Launch.cmd
If Launch.cmd aborted it would cause the launcher to abort as well.
If the error was handled by Launch.cmd then we can assume the launcher ran correctly.
2017-11-22 15:33:29 -08:00
Alan Mason
aef692dddf Removed unused L_CHCK and L_WAIT variables 2017-11-22 15:30:04 -08:00
Alan Mason
dbcaa54f5f QuickBooks split 2017-11-22 15:01:15 -08:00
Alan Mason
b60244a2f9 LaunchOffice cleanup 2017-11-22 15:01:02 -08:00
Alan Mason
88bb009cf2 Split PyScript and some cleanup 2017-11-22 14:50:55 -08:00
Alan Mason
00e0ff5e2d Split PSScript section 2017-11-22 14:42:49 -08:00
Alan Mason
c526c3d1b9 Split Program and Office sections
* Also renamed TestPath for clarity
2017-11-22 14:41:21 -08:00
Alan Mason
bd649f2189 Split LaunchConsole into Native & ConEmu parts 2017-11-22 14:01:54 -08:00
Alan Mason
ec97e4deb3 ConEmu sections updated
* Use a ConEmu variable instead of manually setting IN_CONEMU=True
* USE_CONEMU renamed RELOAD_IN_CONEMU for clarity
2017-11-22 13:51:13 -08:00
Alan Mason
2b7e3f38fe Simplified extraction code
* BREAKING: No longer supports single-file archives.
  * All archives in .cbin are now extracted to their own folder.
2017-11-22 13:49:47 -08:00
Alan Mason
a6d991ca60 Reordered sections 2017-11-22 13:48:07 -08:00
Alan Mason
e28492f32f Fixed a few launchers 2017-11-22 13:45:59 -08:00
Alan Mason
ef844d510c Another attempt to fix CRLF/LF issues 2017-11-22 13:45:23 -08:00
Alan Mason
950110ec8a Adjusted launcher naming 2017-11-22 12:01:43 -08:00
Alan Mason
d8214cce14 Attempt to fix CRLF/LF issue
* Generated launchers were using inconsistent endings causing very strange crashes.
  * New plan: strip current endings and let Python handle them instead.
2017-11-21 18:15:38 -08:00
Alan Mason
2db4252f69 Merge branch 'new-update-script' into develop 2017-11-21 15:14:45 -08:00
Alan Mason
d22339410e Bugfix: Missing Copy script
* File is now renamed using KIT_NAME_FULL
2017-11-21 15:14:36 -08:00
Alan Mason
0681e3d8f4 Merge branch 'new-update-script' into develop 2017-11-21 15:03:40 -08:00
Alan Mason
4bdab51e34 Reduce wait time after removing old launchers 2017-11-21 15:00:49 -08:00
Alan Mason
4701ef77fd Readded network installers
* Only installers for supported years have launchers created
2017-11-21 15:00:20 -08:00
Alan Mason
65d710b72f Trimmed settings.launchers 2017-11-21 13:31:20 -08:00
Alan Mason
deac1a6dda Completed generate launchers 2017-11-21 13:26:33 -08:00
Alan Mason
d0f4dd1f52 Made SDIO Update optional 2017-11-21 13:25:44 -08:00
Alan Mason
830eff27c3 Build kit in new folder 2017-11-21 10:59:57 -08:00
Alan Mason
52684ebb4a Bugfix
* TreeSizeFree downloads and extracts correctly again
* Compressing tools will skip 7-Zip archives
2017-11-21 10:34:52 -08:00
Alan Mason
c47d88aad8 Adjusted formatting for update_kit.py 2017-11-21 00:37:18 -08:00
Alan Mason
b61cb2e0ed Bugfix and a typo 2017-11-21 00:33:07 -08:00
Alan Mason
adef491db0 Misc Cleanup
* Removed launcher used for testing
2017-11-21 00:16:36 -08:00
Alan Mason
93a7a69c29 Compress .cbin done
* Only mildly dangerous?
2017-11-21 00:07:41 -08:00
Alan Mason
6d06371190 Updated VCR InstallAll.bat 2017-11-20 23:13:39 -08:00
Alan Mason
f842cec65b Always more downloads 2017-11-20 23:12:48 -08:00
Alan Mason
3df01a0e05 no message 2017-11-20 23:11:07 -08:00
Alan Mason
ea4036e14d Added ODT downloads 2017-11-20 23:10:42 -08:00
Alan Mason
5c5fba103e Downloads finished
Testing and compression next
2017-11-20 21:23:41 -08:00
Alan Mason
3cc78e085c Hotfix: Copy WizardKit.cmd
* Variable name was incorrect which was preventing archive extraction
2017-11-20 10:49:47 -08:00
Alan Mason
4bf7d000e3 update.py rewrite still in progress
TODO:
* Finish the download sections
* Add section to compress the folders/files in .cbin
2017-11-19 18:51:03 -08:00
Alan Mason
8d287f5d3f Merge branch 'develop' into new-update-script 2017-11-19 02:52:23 -08:00
Alan Mason
59ecefe839 Added initial cbin downloads
* Need to add rest of the tools and compression sections
2017-11-19 02:51:33 -08:00
Alan Mason
e4bcf7f037 Updated README 2017-11-18 22:57:33 -08:00
Alan Mason
1b8ec96379 New update scripts
# Plan #
* Repo should be in a non-functional state
  * This is to avoid confusion when most, if not all, scripts fail to run when first downloaded.
* The first step should be to run Build Kit.cmd which does the following
  * Downloads 7-Zip, ConEmu, Notepad++, & Python (including wheel packages)
    * (i.e. just enough to run update_kit.py)
  * Open .bin/Scripts/settings/main.py in Notepad++ for configuration
  * Move the kit folders into place
    * (i.e. /.root_items/* ->> /, /Build Kit.cmd --> /.bin/Scripts/Build Kit.cmd, etc)

* Added Build Kit.cmd
  * Launches build_kit.ps1

* Added build_kit.ps1
  * Downloads 7-Zip, ConEmu, and Python
  * Launches update_kit.py unless errors are encountered

* Removed all launchers
  * update_kit.py will generate them in a future update
2017-11-18 22:50:58 -08:00
2Shirt
3328a26021
Update Backblaze.url 2017-11-18 20:47:10 -08:00
Alan Mason
b68f1a98e7 Updated Launch.cmd
* Removed PywScript
* Setting L_NCMD with PSScript or PyScript will now use their respective native windows (instead of ConEmu)
  * Relaunch in ConEmu code reworked to avoid launching ConEmu twice in this case
    * i.e. CMD (Launch.cmd) --> ConEmu (Launch.cmd) --> ConEmu (some_script.py)
* Updated PSScript section to match PyScript
2017-11-18 16:14:12 -08:00
Alan Mason
231040526a Updated exit_script()
Keep script open if log can't be opened
2017-11-18 15:42:58 -08:00
Alan Mason
bda6c5d280 Bugifx
Close issue #2
2017-11-18 14:24:13 -08:00
Alan Mason
1fa361ada6 Bugfix
Closes issue #3
2017-11-18 14:00:41 -08:00
Alan Mason
68a11b03cc Update README.md 2017-11-17 01:03:35 -07:00
Alan Mason
6fc04266d4 2017-11: Retroactive Updates
## MAJOR refactoring done ##

* All .cmd Command scripts
  * Brandind / Settings variables now set via .bin/Scripts/settings/main.py
  * Window titles now set using KIT_FULL_NAME

* All .py Python scripts
  * All ClientDir paths should now use KIT_SHORT_NAME
  * Long lines wrapped to better follow PEP8
  * String formatting now more consistant
  * Updated run_program() and popen_program() calls to use lists
    * (e.g. cmd = ['', '', '']; run_program(cmd))
    ** Should improve clarity IMO
  * Update window titles AFTER init_global_vars() so KIT_FULL_NAME can be used

* Branding / Settings
  * Support tech now configurable
    * (e.g. "Please let {tech} know and they'll look into it")
  * Timezone now configurable
  * Upload info can now be disabled/enabled in .bin/Scripts/settings/main.py

* CHKDSK
  * Combined read-only and fix scripts and added menu

* DISM
  * Combined ScanHealth and RestoreHealth scripts and added menu

* functions/common.py
  * BREAKING: run_program() and popen_program() no longer accept 'args' variable

* Misc
  * Removed Win7 NVMe launcher
    * Never used and Win7 is deprecated
  * Removed "DeviceRemover" and "Display Driver Uninstaller" launchers
    * Both cut too deep and were not useful
  * Removed Nirsoft utilities and Sysinternals Suite launchers
    * Too many tools unused.
    * Added .url links to the websites in case the tools are needed
  * Replaced WinDirStat with TreeSizeFree
  * Replaced Q-Dir launcher with XYplorer launcher
    * Q-Dir was running into issues on Windows 10
  * Removed C.IntRep, ESET, and MBAM launchers from "OSR & VR"
  * Removed JRT
    * Deprecated and discontinued by MBAM
  * Removed unsupported QuickBooks launchers (2014 and older)
  * Removed unsupported Office launchers (2010 and 2013\365)
  * Removed "Revo Uninstaller" launcher
  * Removed infrequently used tools from "Diagnostics"
    * Auslogics DiskDefrag
    * BatteryInfoView
    * BIOSCodes
    * GpuTest
    * HeavyLoad

* Bugfixes
  * major_exception() try-blocks should catch CTL+c again
    * Allows for manual script bailing
2017-11-17 01:02:24 -07:00
Alan Mason
41d6cfc209 2017-08: Retroactive Updates
* Bugfixes
  * Windows 10 v1703 / Redstone 2 / Creator's Update now recognized (attempt #2)
2017-11-17 00:57:07 -07:00
Alan Mason
b37a492db5 2017-03: Retroactive Updates
## MAJOR refactoring in progress ##

# BROKEN SCRIPTS #
  (These scripts need updated to use the new global_vars & try_and_print)
    * user_data_transfer.py
    * install_sw_bundle.py

* All Python scripts
  * PLAN: Replace vars_wk with global_vars

* functions.py
  * PLAN: Will hold (nearly?) all functions going forward
    * Should simplify the remaining scripts
    * (e.g. reset_browsers and sw_diagnostics both had a backup_browsers())
  * PLAN: Move all program definitions to functions.py
    * (e.g. vars_wk['SevenZip'] --> global_vars['Programs']['SevenZip'])
  * Added major_exception()
    * Should be called if anything goes wrong to alert user and provide info
  * Added non_clobber_rename()
    * Appends a number (if necessary) to avoid overwriting data
  * Added popen_program()
    * Removes subprocess req for sw_checklist
  * Added try_and_print()
    * Run a function and show CS/NS/etc
    * Can add additional "result" strings via Exception classes
    * Passes unrecognized args/kwargs to the function
    * Used by scripts to standardize message formatting and error handling
  * exit_script() now handles opening the log (if set) and killing caffeine.exe
  * Refactored init_vars_wk/os code to work with global_vars
    * Uses the try_and_print function for better formatting and error handling
    * BREAKING: 'OS' vars now located in global_vars['OS'] (including 'Arch')
      * OS labeled as 'outdated', 'very outdated', and 'unrecognized' as needed
    * BREAKING: renamed PROGRAMS to TOOLS
      * Expanded TOOLS
  * Removed log_file as a required argument from all functions
  * Removed vars_wk/global_vars as a required argument from all functions
  * Removed unused WinPE functions
  * Sorted functions

* user_checklist() (formerly reset_browsers())
  * Most functions moved to functions.py (see above)
  * Browsers
    * Work has been split into backup, reset, and config sections
    * Script now asks all questions before starting backup/reset/config
    * Script now forces the homepage to DEFAULT_HOMEPAGE (set in functions.py)
      * (i.e. it no longer asks first, it just does it)
    * Current homepages are listed where possible before backup/reset/config

* Launch/Launchers
  * Added QuickBooks support

* Removed launchers
  * CPU-Z
  * HWMonitor
  * PerfMonitor2
  * SanDisk Express Cache
  * Shortcut Cleaner
  * SuperAntiSpyware (SAS)

* Replaced Notepad2-Mod with Notepad++
2017-11-17 00:56:16 -07:00
Alan Mason
1822b7e9bf 2016-12: Retroactive Updates
* Removed SIV and switched back to AIDA64
* Bugfixes
2017-11-17 00:55:27 -07:00
Alan Mason
7616f2ea5f 2016-11: Retroactive Updates
* NEW: CompressedBin folder .cbin
  * This folder holds compressed versions of what was in .bin
    * These files are 7-zip compressed using file + header encryption
    * (This is to avoid false-positive AV alerts)

* NEW: Python conversion
  * All scripts rewritten / ported to Python
  * All PoSH scripts removed
  * All scripts adjusted to no longer use vars as a variable
    * This is because vars is a built-in function
    * Also, slightly more clear as vars_wk == variables for Wizard Kit
  * vars_os merged with vars_wk for since both are based on the current system
  * Launch.cmd no longer uses %path% and instead directly modifies L_PATH
    * fixes bug where an empty %PATH% would halt various scripts

* Copy WizardKit
  * Now only copies the required folders in .bin
    * Avoids potentially massive slowdowns on often-used UFDs
  * Updated to support the new .cbin folder

* User Data Transfer expanded
  * File-based main data selection is now done first
  * Default inclusions and exclusions adjusted
  * Cleanup should now unhide TransferDir

* Launch.cmd and Launchers updated
  * Launch and Launcher_Template reworked to support the new .cbin method
    * Launch will extract the archive (if exists) and then launch the item
  * Launch.cmd now automatically reloads inside ConEmu
  * Launch.cmd now runs from L_ITEM's dir in most cases
  * Added L_NCMD to use the native command window instead of ConEmu
  * Added PywScript mode that uses Python native console window
  * Launchers are customized at the top of the files now
    * FindBin and Flags functions have been moved to the end of the file
  * Launchers and Launch.cmd now use more descriptive variable names
    * Helps readability and troubleshooting
  * Ported code from copy_office.cmd into Launch.cmd
    * Office setup local folders now have better naming
  * Scripts should now print details about the ENV when aborting
    * Should help diagnose future breaks, typos, etc..
  * Added a gen_office.bash script for creating the Office Setup Launchers
  * Fixed Office variable issue (needed delayedexpansion)

* SW Diagnostics / SW Checklist
  * (Re)added Kill All Processes section using ProcessKiller 2.0 from Tron
  * Added Everything - dumps a file listing of the %systemdrive%
  * Added Opera to the browser backup section
  * AdwCleaner is no longer removed during the checklist
  * HWiNFO has replaced HWMonitor due to false AMD/ATI readings
  * HWiNFO is not opened until after Enter is pressed to exit the checklist
  * Installed OS warnings expanded to mark many more versions as outdated
  * SAS is no longer force-removed at the end of the script
  * The new user data size function is reading data for all users
2017-11-17 00:54:34 -07:00
Alan Mason
b180b42ec9 2016-10: Retroactive Updates
# Migration to Python started #
  * PoSH has an extreme slowdown for some systems while it runs an optimization
  ** pass for .NET on the first PoSH script execution.
  ** This is reason enough to move to an alternative.

* New additions:
  * User Data Transfer script
    * Will extract from a WIM or copy from a folder
    * Uses wimlib-imagex for images and FastCopy for folders
    * Removes undesired items after transfer/extraction
  * HWiNFO
  * Missing ODD repair registry patch
  * Q-Dir
  * SW Bundle install script

* ConEmu
  * Moving back to ConEmu for better performance.

* Copy-WizardKit
  * Now uses FastCopy

* functions.py
  * Ported init.ps1 to Python using functions.py (from WinPE) as a base

* Launch.cmd
  * Elevating programs/scripts now done using a temp VBScript file
  * Can run Python scripts (using either the 32 or 64 bit runtime)

* transferred_keys.cmd
  * Expanded searched paths

* Misc
  * Lots of variables and files renamed
  * Lots of hard-coded paths are now in variables
    * Should only be set in scripts in %bin%\Scripts
  * Moved a subset of the Diagnostics launchers to a new 'Extras' folder
    * The launchers moved are those that are less-often used
  * Refactored FindBin code to be more concise
  * Renamed "KitDir" "ClientDir" to indicate that it is on the client's system
  * Removed GeForce Experience launcher as it now requires an account
  * Added link to NVIDIA's driver webpage to download the correct driver
  * Removed AMD's Gaming Evolved launcher
    * This is usually bundled with the GPU driver anyway
  * Switched back to ConEmu
  * Variable and script names are now more descriptive
    * i.e. checklist -> final_checklist, and HH -> %kit_dir%
    * (not happy with %kit_dir%, will probably change again)
2017-11-17 00:53:08 -07:00
Alan Mason
d9dddebccb 2016-09: Retroactive Updates
Major .bin and extraction code overhaul

* All .cmd files now have code for searching the for the .bin folder
  * This starts at the script's parent folder and moves upward
  * If no .bin folder is found then print an error to the screen

* 7z has been replaced with 7za
  * This is for better handling of x32/x64 usage
  * This also fixed a few bugs with extracting ProduKey/MailPassView/etc
  * We no longer require the full power of 7z.exe/7z.dll
  * (Since wimlib-imagex will probably be used for WIM files soon-ish)

* Bugfixes
  * A few calls of pushd were unsafe (without quotes)
  * SFC scan no longer closes immediately
2017-11-17 00:51:54 -07:00
Alan Mason
a4c0c487ff 2016-08: Retroactive Updates
* Added OutlookAttachView

* Added PerfMonitor2

* CHKDSK
  * Will use the newer repair features on Windows 8 or newer

* MailPassView & ProduKey
  * Now saved in a 7-Zip encrypted archive to avoid deletion by AV

* SW Checklist / Diagnostics
  * Windows 10 Blocked automatically
    * (Too late but whatevs it was in testing before the cutoff)

* Bugfixes
  * Activate Windows (with BIOS key)
    * Wasn't extracting ProduKey before trying to run it
  * SW Diagnostics
    * Should now report the preview size from BleachBit correctly
2017-11-17 00:51:23 -07:00
Alan Mason
3031df5a4c 2016-07: Retroactive Updates
* DISM
  * Much safer WinVer check

* Enter / Exit SafeMode
  * Now enables MSI (un)installers in SafeMode w/ Networking

* Final Checklist
  * NEW: can now be run directly from UFD

* Hide Windows 10 Upgrade.reg
  * Added more registry blocks

* Removed Chocolately
  * Too much volatility
  * Ninite will regain default installer status

* Replaced ConEmu with Cmder
  * Cmder has a heavily modified ConEmu
  * Changed background
  * Added Cmder launchers in Misc

* SW Diagnostics
  * NEW: can now be run directly from UFD
  * BleachBit / Winapp2.ini updated
    * Expanded selections
    * Now only checks temp data size; DOES NOT delete temp data
  * Internet connection test will now loop until the manually exited
  * Now warns you that it can't check Windows activation in SafeMode

* Bugfixes
  * reset_browsers.ps1
    * Should skip "resetting" the backup folders (i.e. Default.wkbak)
2017-11-17 00:50:54 -07:00
Alan Mason
c6e58088af 2016-06: Retroactive initial commit 2017-11-17 00:50:27 -07:00
625 changed files with 49372 additions and 2324 deletions

13
.gitignore vendored
View file

@ -1,5 +1,8 @@
*iso
Scripts/__pycache__
dism*
mount
pe_files
**/__pycache__
**/*.7z
**/*.DS_Store
**/*.bak
**/*.exe
**/*.swp
setup/BUILD*
setup/OUT*

6
.pre-commit-config.yaml Normal file
View file

@ -0,0 +1,6 @@
repos:
- repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version.
rev: 'v0.0.257'
hooks:
- id: ruff

View file

@ -1,7 +1,7 @@
Copyright (c) 2017 Alan Mason
Copyright (c) 2023 Alan Mason
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View file

@ -1,18 +1,39 @@
# Wizard Kit PE #
A collection of scripts to help technicians service Windows systems.
# NOTICE: Currently under maintenance #
*These scripts are being reviewed and updated at the moment.*
Things may or may not work until this is completed. This warning will be removed once the maintenance is finished.
## Requirements ##
* Windows Assessment and Deployment Kit for Windows 10
## Initial Setup ##
* Install Windows ADK for Windows 10
* Run "Deployment and Imaging Tools Environment" as admin
* Run `make.cmd` to build a new Windows 10 PE image
# WizardKit #
A collection of tools to help technicians service computers.
## Overview ##
There are a few main parts to this project and their uses:
* Live Linux image
* Hardware diagnostics
* CPU stress tests with temperature monitoring
* Health checks/tests for storage drives
* Misc other diagnostics
* Data recovery
* General data transfers from many possible filesystems
* Bit-level drive duplication based on ddrescue
* Live macOS image
* Hardware diagnostics
* CPU stress tests with temperature monitoring
* Health checks/tests for storage drives
* Data recovery
* _(Currently under development)_
* Live WinPE image
* _(Currently under development)_
* Windows Kit _(intended for UFDs)_
* Automated repairs
* AV scans
* Windows health checks
* Automated setup
* Install software
* System configuration
## Combined UFD ##
All parts can be combined onto a single UFD!
* Compatible with most legacy and UEFI bootloaders
* Custom boot menus
* To get started run `build-ufd` under the live Linux image

File diff suppressed because it is too large Load diff

View file

@ -1,277 +0,0 @@
# WK WinPE Menu
# Init
import os
import re
import subprocess
import sys
import time
import traceback
os.chdir(os.path.dirname(os.path.realpath(__file__)))
bin = os.path.abspath('..\\')
sys.path.append(os.getcwd())
from functions import *
## Colors
COLORS = {
'CLEAR': '\033[0m',
'RED': '\033[31m',
'GREEN': '\033[32m',
'YELLOW': '\033[33m',
'BLUE': '\033[34m'}
def menu_backup_imaging():
"""Take backup images of partition(s) in the WIM format and save them to a backup share"""
errors = False
# Set ticket ID
os.system('cls')
ticket_id = get_ticket_id()
# Mount backup shares
mount_backup_shares()
# Select destination
dest = select_destination()
if dest is None:
abort_to_main_menu('Aborting Backup Creation')
# Select disk to backup
disk = select_disk('For which drive are we creating backups?')
if disk is None:
abort_to_main_menu()
prep_disk_for_backup(dest, disk, ticket_id)
# Display details for backup task
os.system('cls')
print('Create Backup - Details:\n')
print(' Ticket: \t{ticket_id}'.format(ticket_id=ticket_id))
print(' Source: \t[{Table}] ({Type}) {Name} {Size}\n'.format(**disk))
print(' Destination:\t{name}'.format(name=dest.get('Display Name', dest['Name'])))
for par in disk['Partitions']:
print(par['Display String'])
print(disk['Backup Warnings'])
# Ask to proceed
if (not ask('Proceed with backup?')):
abort_to_main_menu('Aborting Backup Creation')
# Backup partition(s)
print('\n\nStarting task.\n')
for par in disk['Partitions']:
try:
backup_partition(bin, disk, par)
except BackupError:
errors = True
# Verify backup(s)
if disk['Valid Partitions'] > 1:
print('\n\n Verifying backups\n')
else:
print('\n\n Verifying backup\n')
for par in disk['Partitions']:
if par['Number'] in disk['Bad Partitions']:
continue # Skip verification
try:
verify_wim_backup(bin, par)
except BackupError:
errors = True
# Print summary
if errors:
print_warning('\nErrors were encountered and are detailed below.')
for par in [p for p in disk['Partitions'] if 'Error' in p]:
print(' Partition {Number} Error:'.format(**par))
for line in [line.strip() for line in par['Error'] if line.strip() != '']:
print_error('\t{line}'.format(line=line))
time.sleep(30)
else:
print_success('\nNo errors were encountered during imaging.')
time.sleep(5)
pause('\nPress Enter to return to main menu... ')
def menu_windows_setup():
"""Format a drive, partition for MBR or GPT, apply a Windows image, and rebuild the boot files"""
errors = False
# Set ticket ID
os.system('cls')
ticket_id = get_ticket_id()
# Select the version of Windows to apply
windows_version = select_windows_version()
# Select drive to use as the OS drive
dest_disk = select_disk('To which drive are we installing Windows?')
prep_disk_for_formatting(dest_disk)
# Find Windows image
## NOTE: Needs to happen AFTER select_disk() is called as there's a hidden assign_volume_letters().
## This changes the current letters thus preventing installing from a local source.
windows_image = find_windows_image(bin, windows_version)
# Display details for setup task
os.system('cls')
print('Setup Windows - Details:\n')
print(' Ticket: \t{ticket_id}'.format(ticket_id=ticket_id))
print(' Installing: \t{winver}'.format(winver=windows_version['Name']))
print(' Boot Method:\t{_type}'.format(
_type='UEFI (GPT)' if dest_disk['Use GPT'] else 'Legacy (MBR)'))
print(' Using Image:\t{File}.{Ext}'.format(**windows_image))
print_warning(' ERASING: \t[{Table}] ({Type}) {Name} {Size}\n'.format(**dest_disk))
for par in dest_disk['Partitions']:
print_warning(par['Display String'])
print_warning(dest_disk['Format Warnings'])
if (not ask('Is this correct?')):
abort_to_main_menu('Aborting Windows setup')
# Safety check
print('\nSAFETY CHECK')
print_warning('All data will be DELETED from the drive and partition(s) listed above.')
print_warning('This is irreversible and will lead to {CLEAR}{RED}DATA LOSS.'.format(**COLORS))
if (not ask('Asking again to confirm, is this correct?')):
abort_to_main_menu('Aborting Windows setup')
# Release currently used volume letters (ensures that the drives will get S, T, & W as needed below)
remove_volume_letters(keep=windows_image['Source'])
# Format and partition drive
print('\n Formatting Drive... \t\t', end='', flush=True)
try:
if (dest_disk['Use GPT']):
format_gpt(dest_disk, windows_version['Family'])
else:
format_mbr(dest_disk, windows_version['Family'])
print_success('Complete.')
except:
# We need to crash as the drive is in an unknown state
print_error('Failed.')
raise
# Apply Image
print(' Applying Image... \t\t', end='', flush=True)
try:
setup_windows(bin, windows_image, windows_version)
print_success('Complete.')
except subprocess.CalledProcessError:
print_error('Failed.')
errors = True
except:
# We need to crash as the OS is in an unknown state
print_error('Failed.')
raise
# Create Boot files
print(' Update Boot Partition...\t\t', end='', flush=True)
try:
update_boot_partition()
print_success('Complete.')
except subprocess.CalledProcessError:
# Don't need to crash as this is (potentially) recoverable
print_error('Failed.')
errors = True
except:
print_error('Failed.')
raise
# Setup WinRE
print(' Update Recovery Tools...\t\t', end='', flush=True)
try:
setup_windows_re(windows_version)
print_success('Complete.')
except SetupError:
print('Skipped.')
except:
# Don't need to crash as this is (potentially) recoverable
print_error('Failed.')
errors = True
# Print summary
if errors:
print_warning('\nErrors were encountered during setup.')
time.sleep(30)
else:
print_success('\nNo errors were encountered during setup.')
time.sleep(5)
pause('\nPress Enter to return to main menu... ')
def menu_tools():
tools = [
{'Name': 'Blue Screen View', 'Folder': 'BlueScreenView', 'File': 'BlueScreenView.exe'},
{'Name': 'CPU-Z', 'Folder': 'CPU-Z', 'File': 'cpuz.exe'},
{'Name': 'Fast Copy', 'Folder': 'FastCopy', 'File': 'FastCopy.exe', 'Args': ['/log', '/logfile=X:\WK\Info\FastCopy.log', '/cmd=noexist_only', '/utf8', '/skip_empty_dir', '/linkdest', '/open_window', '/balloon=FALSE', r'/exclude=$RECYCLE.BIN;$Recycle.Bin;.AppleDB;.AppleDesktop;.AppleDouble;.com.apple.timemachine.supported;.dbfseventsd;.DocumentRevisions-V100*;.DS_Store;.fseventsd;.PKInstallSandboxManager;.Spotlight*;.SymAV*;.symSchedScanLockxz;.TemporaryItems;.Trash*;.vol;.VolumeIcon.icns;desktop.ini;Desktop?DB;Desktop?DF;hiberfil.sys;lost+found;Network?Trash?Folder;pagefile.sys;Recycled;RECYCLER;System?Volume?Information;Temporary?Items;Thumbs.db']},
{'Name': 'HWiNFO', 'Folder': 'HWiNFO', 'File': 'HWiNFO.exe'},
{'Name': 'NT Password Editor', 'Folder': 'NT Password Editor', 'File': 'ntpwedit.exe'},
{'Name': 'Notepad++', 'Folder': 'NotepadPlusPlus', 'File': 'notepadplusplus.exe'},
{'Name': 'PhotoRec', 'Folder': 'TestDisk', 'File': 'photorec_win.exe', 'Args': ['-new_console:n']},
{'Name': 'Prime95', 'Folder': 'Prime95', 'File': 'prime95.exe'},
{'Name': 'ProduKey', 'Folder': 'ProduKey', 'File': 'ProduKey.exe', 'Args': ['/external', '/ExtractEdition:1']},
{'Name': 'Q-Dir', 'Folder': 'Q-Dir', 'File': 'Q-Dir.exe'},
{'Name': 'TestDisk', 'Folder': 'TestDisk', 'File': 'testdisk_win.exe', 'Args': ['-new_console:n']},
]
actions = [
{'Name': 'Main Menu', 'Letter': 'M'},
]
# Menu loop
while True:
selection = menu_select('Tools Menu', tools, actions)
if (selection.isnumeric()):
tool = tools[int(selection)-1]
cmd = ['{bin}\\{folder}\\{file}'.format(bin=bin, folder=tool['Folder'], file=tool['File'])]
if tool['Name'] == 'Blue Screen View':
# Select path to scan
minidump_path = select_minidump_path()
if minidump_path is not None:
tool['Args'] = ['/MiniDumpFolder', minidump_path]
if 'Args' in tool:
cmd += tool['Args']
try:
subprocess.Popen(cmd)
except:
print_error('Failed to run {prog}'.format(prog=tool['Name']))
time.sleep(2)
elif (selection == 'M'):
break
def menu_main():
menus = [
{'Name': 'Create Backups', 'Menu': menu_backup_imaging},
{'Name': 'Setup Windows', 'Menu': menu_windows_setup},
{'Name': 'Misc Tools', 'Menu': menu_tools},
]
actions = [
{'Name': 'Command Prompt', 'Letter': 'C'},
{'Name': 'Reboot', 'Letter': 'R'},
{'Name': 'Shutdown', 'Letter': 'S'},
]
# Main loop
while True:
selection = menu_select('Main Menu', menus, actions, secret_exit=True)
if (selection.isnumeric()):
try:
menus[int(selection)-1]['Menu']()
except AbortError:
pass
except:
print_error('Major exception in: {menu}'.format(menu=menus[int(selection)-1]['Name']))
print_warning(' Please let The Wizard know and he\'ll look into it (Please include the details below).')
print(traceback.print_exc())
time.sleep(5)
print_info(' You can retry but if this crashes again an alternative approach may be required.')
pause('\nPress enter to return to the main menu')
elif (selection == 'C'):
run_program(['cmd', '-new_console:n'], check=False)
elif (selection == 'R'):
run_program(['wpeutil', 'reboot'])
elif (selection == 'S'):
run_program(['wpeutil', 'shutdown'])
else:
sys.exit(0)
if __name__ == '__main__':
menu_main()

View file

@ -1,325 +0,0 @@
# WK WinPE - PARTITION UIDs
# sources: https://en.wikipedia.org/wiki/GUID_Partition_Table
# https://en.wikipedia.org/wiki/Partition_type
PARTITION_UIDS = {
'00': {'OS': 'All', 'Description': 'Empty partition entry'},
'01': {'OS': 'DOS 2.0+', 'Description': 'FAT12 as primary partition in first physical 32 MB of disk or as logical drive anywhere on disk (else use 06hinstead)'},
'02': {'OS': 'XENIX', 'Description': 'XENIX root'},
'03': {'OS': 'XENIX', 'Description': 'XENIX usr'},
'04': {'OS': 'DOS 3.0+', 'Description': 'FAT16 with less than 65536 sectors (32 MB). As primary partition it must reside in first physical 32 MB of disk, or as logical drive anywhere on disk (else use 06h instead).'},
'05': {'OS': 'DOS (3.2) 3.3+ / SpeedStor', 'Description': 'Extended partition with CHS addressing. It must reside in first physical 8 GB of disk, else use 0Fh instead / can occur in SpeedStor MBRs'},
'06': {'OS': 'DOS 3.31+', 'Description': 'FAT16B with 65536 or more sectors. It must reside in first physical 8 GB of disk, unless used for logical drives in an 0Fh extended partition (else use 0Eh instead). Also used for FAT12 and FAT16 volumes in primary partitions if they are not residing in first physical 32 MB of disk.'},
'07': {'OS': 'OS/2 1.2+ / OS/2 1.2+, Windows NT / Windows NT / Windows Embedded CE / QNX 2', 'Description': 'IFS / HPFS / NTFS / exFAT / QNX "qnx" (7) (pre-1988 only)'},
'08': {'OS': 'Commodore MS-DOS 3.x / OS/2 1.0-1.3 / AIX / QNX 1.x/2.x', 'Description': 'Logical sectored FAT12 or FAT16 / OS/2 (FAT?) / AIX boot/split / SplitDrive / QNX "qny" (8) / partition spanning multiple drives'},
'09': {'OS': 'AIX / QNX 1.x/2.x / Coherent / OS-9', 'Description': 'AIX data/boot / QNX "qnz" (9) / Coherent file system / OS-9 RBF'},
'0A': {'OS': 'OS/2 / Coherent', 'Description': 'OS/2 Boot Manager / Coherent swap partition'},
'0B': {'OS': 'DOS 7.1+', 'Description': 'FAT32 with CHS addressing'},
'0C': {'OS': 'DOS 7.1+', 'Description': 'FAT32 with LBA'},
'0D': {'OS': 'Silicon Safe', 'Description': 'Reserved'},
'0E': {'OS': 'DOS 7.0+', 'Description': 'FAT16B with LBA'},
'0F': {'OS': 'DOS 7.0+', 'Description': 'Extended partition with LBA'},
'10': {'OS': 'OPUS', 'Description': 'Unknown'},
'11': {'OS': 'Leading Edge MS-DOS 3.x / OS/2 Boot Manager', 'Description': 'Logical sectored FAT12 or FAT16 / Hidden FAT12 '},
'12': {'OS': 'Compaq Contura', 'Description': 'configuration partition (bootable FAT) / configuration partition / hibernation partition / diagnostics and firmware partition (bootable FAT) / service partition (bootable FAT) / Rescue and Recovery partition'},
'14': {'OS': 'AST MS-DOS 3.x / OS/2 Boot Manager / Maverick OS', 'Description': 'Logical sectored FAT12 or FAT16 / Hidden FAT16 / Omega file system'},
'15': {'OS': 'OS/2 Boot Manager / Maverick OS', 'Description': 'Hidden extended partition with CHS addressing / swap'},
'16': {'OS': 'OS/2 Boot Manager', 'Description': 'Hidden FAT16B '},
'17': {'OS': 'OS/2 Boot Manager', 'Description': 'Hidden IFS / Hidden HPFS / Hidden NTFS / Hidden exFAT '},
'18': {'OS': 'AST Windows', 'Description': 'AST Zero Volt Suspend or SmartSleep partition'},
'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 partition with LBA addressing '},
'20': {'OS': 'Windows Mobile', 'Description': 'Windows Mobile update XIP / Willowsoft Overture File System (OFS1)'},
'21': {'OS': 'Oxygen', 'Description': 'HP Volume Expansion (SpeedStor) / FSo2 (Oxygen File System)'},
'22': {'OS': 'Oxygen', 'Description': 'Oxygen Extended Partition Table'},
'23': {'OS': 'Windows Mobile', 'Description': 'Reserved / Windows Mobile boot XIP'},
'24': {'OS': 'NEC MS-DOS 3.30', 'Description': 'Logical sectored FAT12 or FAT16 '},
'25': {'OS': 'Windows Mobile', 'Description': 'Windows Mobile IMGFS[citation needed]'},
'26': {'OS': 'Microsoft, IBM', 'Description': 'Reserved'},
'27': {'OS': 'Windows / PQservice / MirOS BSD / RooterBOOT', 'Description': 'Windows Recovery Environment (RE) partition (hidden NTFS partition type 07h) / FAT32 or NTFS rescue partition / MirOS partition / RooterBOOT kernel partition (contains a raw ELF Linux kernel, no file system)'},
'2A': {'OS': 'AtheOS', 'Description': 'AtheOS file system (AthFS, AFS) (an extension of BFS, see 2Bh and EBh) / Reserved'},
'2B': {'OS': 'SyllableOS', 'Description': 'SyllableSecure (SylStor), a variant of AthFS (an extension of BFS, see 2Ah and EBh)'},
'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 Warp Server /eComStation', 'Description': 'JFS (OS/2 implementation of AIX Journaling File system)'},
'36': {'OS': 'Microsoft, IBM', 'Description': 'Reserved'},
'38': {'OS': 'THEOS', 'Description': 'THEOS version 3.2, 2 GB partition'},
'39': {'OS': 'Plan 9 / THEOS', 'Description': 'Plan 9 edition 3 partition (sub-partitions described in second sector of partition) / THEOS version 4 spanned partition'},
'3A': {'OS': 'THEOS', 'Description': 'THEOS version 4, 4 GB partition'},
'3B': {'OS': 'THEOS', 'Description': 'THEOS version 4 extended partition'},
'3C': {'OS': 'PartitionMagic', 'Description': 'PqRP (PartitionMagic or DriveImage 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': 'Personal RISC / Linux / PowerPC', 'Description': 'Personal RISC Boot / Old Linux/Minix (disk shared with DR DOS 6.0) / PPC PReP (Power PC Reference Platform) Boot'},
'42': {'OS': 'SFS / Linux / Windows 2000, XP, etc.', 'Description': 'Secure File system (SFS) / Old Linux swap (disk shared with DR DOS 6.0) / Dynamic extended partition marker'},
'43': {'OS': 'Linux', 'Description': 'Old Linux native (disk shared with DR DOS 6.0) '},
'44': {'OS': 'GoBack', 'Description': 'Norton GoBack, WildFile GoBack, Adaptec GoBack, Roxio GoBack'},
'45': {'OS': 'Boot-US / EUMEL/ELAN', 'Description': 'Priam / Boot-US boot manager (1 cylinder) / 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 advanced lightweight file system for DOS'},
'4C': {'OS': 'ETH Oberon', 'Description': 'Aos (A2) file system (76)'},
'4D': {'OS': 'QNX 4.x, Neutrino', 'Description': 'Primary QNX POSIX volume on disk (77)'},
'4E': {'OS': 'QNX 4.x, Neutrino', 'Description': 'Secondary QNX POSIX volume on disk (78)'},
'4F': {'OS': 'QNX 4.x, Neutrino / ETH Oberon', 'Description': 'Tertiary QNX POSIX volume on disk (79) / boot / native file system (79)'},
'50': {'OS': 'ETH Oberon / Disk Manager 4 / LynxOS / Novell', 'Description': 'Alternative native file system (80) / Read-only partition (old) / Lynx RTOS'},
'51': {'OS': 'Disk Manager 4-6', 'Description': 'Read-write 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': 'EZ-Drive, Maxtor, MaxBlast, or DriveGuide INT 13h redirector volume'},
'56': {'OS': 'AT&T MS-DOS 3.x / EZ-Drive / VFeature', 'Description': 'Logical sectored FAT12 or FAT16 / Disk Manager partition converted to EZ-BIOS / VFeature partitionned volume'},
'57': {'OS': 'DrivePro', 'Description': 'VNDI partition'},
'5C': {'OS': 'EDISK', 'Description': 'Priam EDisk Partitioned Volume '},
'61': {'OS': 'SpeedStor', 'Description': 'Unknown'},
'63': {'OS': 'Unix', 'Description': 'SCO Unix, ISC, UnixWare, AT&T System V/386, ix, MtXinu BSD 4.3 on Mach, GNU HURD'},
'64': {'OS': 'SpeedStor / NetWare', 'Description': 'NetWare File System 286/2 / PC-ARMOUR'},
'65': {'OS': 'NetWare', 'Description': 'NetWare File System 386'},
'66': {'OS': 'NetWare / NetWare', 'Description': 'NetWare File System 386 / Storage Management Services (SMS)'},
'67': {'OS': 'NetWare', 'Description': 'Wolf Mountain'},
'68': {'OS': 'NetWare', 'Description': 'Unknown'},
'69': {'OS': 'NetWare 5 / NetWare', 'Description': 'Novell Storage Services (NSS)'},
'6E': {'Description': 'Unknown'},
'70': {'OS': 'DiskSecure', 'Description': 'DiskSecure multiboot'},
'71': {'OS': 'Microsoft, IBM', 'Description': 'Reserved'},
'72': {'OS': 'APTI conformant systems / Unix V7/x86', 'Description': 'APTI alternative FAT12 (CHS, SFN) / 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 alternative FAT16 (CHS, SFN) '},
'7A': {'OS': 'APTI conformant systems', 'Description': 'APTI alternative FAT16 (LBA, SFN) '},
'7B': {'OS': 'APTI conformant systems', 'Description': 'APTI alternative FAT16B (CHS, SFN) '},
'7C': {'OS': 'APTI conformant systems', 'Description': 'APTI alternative FAT32 (LBA, SFN) '},
'7D': {'OS': 'APTI conformant systems', 'Description': 'APTI alternative FAT32 (CHS, SFN) '},
'7E': {'OS': 'F.I.X. (claim) / PrimoCache', 'Description': 'Level 2 cache'},
'7F': {'OS': 'Varies', 'Description': 'Alternative OS Development Partition Standard - reserved for individual or local use and temporary or experimental projects'},
'80': {'OS': 'Minix 1.1-1.4a', 'Description': 'Minix file system (old)'},
'81': {'OS': 'Minix 1.4b+ / Linux', 'Description': 'MINIX file system / Mitac Advanced Disk Manager'},
'82': {'OS': 'Linux / Sun Microsystems', 'Description': 'Linux swap space / Solaris x86 (for Sun disklabels up to 2005) / Prime'},
'83': {'OS': 'GNU/Linux', 'Description': 'Any native Linux file system '},
'84': {'OS': 'OS/2 / Windows 7', 'Description': 'APM hibernation (suspend to disk, S2D) / Hidden C: (FAT16) / Rapid Start technology'},
'85': {'OS': 'GNU/Linux', 'Description': 'Linux extended '},
'86': {'OS': 'Windows NT 4 Server / Linux', 'Description': 'Fault-tolerant FAT16B mirrored volume set / Linux RAID superblock with auto-detect (old)'},
'87': {'OS': 'Windows NT 4 Server', 'Description': 'Fault-tolerant HPFS/NTFS mirrored volume set '},
'88': {'OS': 'GNU/Linux', 'Description': 'Linux plaintext partition table'},
'8A': {'OS': 'AiR-BOOT', 'Description': 'Linux kernel image'},
'8B': {'OS': 'Windows NT 4 Server', 'Description': 'Legacy fault-tolerant FAT32 mirrored volume set '},
'8C': {'OS': 'Windows NT 4 Server', 'Description': 'Legacy fault-tolerant 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 with CHS addressing '},
'92': {'OS': 'Free FDISK', 'Description': 'Hidden FAT16B '},
'93': {'OS': 'Amoeba / Linux', 'Description': 'Amoeba native file system / Hidden Linux file system'},
'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 partition (bootable FAT) ROM-DOS SuperBoot / service partition (bootable FAT)'},
'99': {'OS': 'early Unix', 'Description': 'Unknown'},
'9A': {'OS': 'Free FDISK', 'Description': 'Hidden FAT16 '},
'9B': {'OS': 'Free FDISK', 'Description': 'Hidden extended partition with LBA '},
'9E': {'OS': 'VSTA / ForthOS', 'Description': 'ForthOS (eForth port)'},
'9F': {'OS': 'BSD/OS 3.0+, BSDI', 'Description': 'Unknown'},
'A0': {'OS': 'Hewlett Packard / Phoenix, IBM, Toshiba, Sony', 'Description': 'Diagnostic partition for HP laptops / Hibernate partition'},
'A1': {'OS': 'Hewlett Packard / Phoenix, NEC', 'Description': 'HP Volume Expansion (SpeedStor) / Hibernate partition'},
'A2': {'OS': 'Cyclone V', 'Description': 'Hard Processor System (HPS) ARM preloader'},
'A3': {'OS': 'Hewlett Packard', 'Description': 'HP Volume Expansion (SpeedStor)'},
'A4': {'OS': 'Hewlett Packard', 'Description': 'HP Volume Expansion (SpeedStor)'},
'A5': {'OS': 'BSD', 'Description': 'BSD slice (BSD/386, 386BSD, NetBSD (old), FreeBSD)'},
'A6': {'OS': 'OpenBSD', 'Description': 'HP Volume Expansion (SpeedStor) / OpenBSD 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 MS-DOS FAT12 (1.44 MB) '},
'AB': {'OS': 'Darwin, Mac OS X / GO! OS', 'Description': 'Apple Darwin, Mac OS X boot / GO!'},
'AD': {'OS': 'RISC OS', 'Description': 'ADFS / FileCore format'},
'AE': {'OS': 'ShagOS', 'Description': 'ShagOS file system'},
'AF': {'OS': 'ShagOS', 'Description': 'Apple Mac OS X HFS and HFS+ / ShagOS swap'},
'B0': {'OS': 'Boot-Star', 'Description': 'Boot-Star dummy partition'},
'B1': {'OS': 'QNX 6.x', 'Description': 'HP Volume Expansion (SpeedStor) / QNX Neutrino power-safe file system'},
'B2': {'OS': 'QNX 6.x', 'Description': 'QNX Neutrino power-safe file system'},
'B3': {'OS': 'QNX 6.x', 'Description': 'HP Volume Expansion (SpeedStor) / QNX Neutrino power-safe file system'},
'B4': {'OS': 'Hewlett Packard', 'Description': 'HP Volume Expansion (SpeedStor)'},
'B6': {'OS': 'Windows NT 4 Server', 'Description': 'HP Volume Expansion (SpeedStor) / Corrupted fault-tolerant FAT16B mirrored master volume '},
'B7': {'OS': 'BSDI (before 3.0) / Windows NT 4 Server', 'Description': 'BSDI native file system / swap / Corrupted fault-tolerant HPFS/NTFS mirrored master volume '},
'B8': {'OS': 'BSDI (before 3.0)', 'Description': 'BSDI swap / native file system'},
'BB': {'OS': 'BootWizard, OS Selector / Acronis True Image / Windows NT 4 Server', 'Description': 'PTS BootWizard 4 / OS Selector 5 for hidden partitions other than 01h, 04h, 06h, 07h, 0Bh, 0Ch, 0Eh and unformatted partitions / OEM Secure Zone (corresponds to BCh) / Corrupted fault-tolerant FAT32 mirrored master volume '},
'BC': {'OS': 'Windows NT 4 Server / Acronis True Image / Backup Capsule', 'Description': 'Corrupted fault-tolerant FAT32 mirrored master volume / Acronis Secure Zone / Backup Capsule'},
'BD': {'OS': 'BonnyDOS/286', 'Description': 'Unknown'},
'BE': {'OS': 'Solaris 8', 'Description': 'Solaris 8 boot'},
'BF': {'OS': 'Solaris', 'Description': 'Solaris x86 (for Sun disklabels, since 2005)'},
'C0': {'OS': 'DR-DOS, Multiuser DOS,REAL/32', 'Description': 'Secured FAT partition (smaller than 32 MB)'},
'C1': {'OS': 'DR DOS 6.0+', 'Description': 'Secured FAT12 '},
'C2': {'OS': 'Power Boot', 'Description': 'Hidden Linux native file system'},
'C3': {'OS': 'Power Boot', 'Description': 'Hidden Linux swap'},
'C4': {'OS': 'DR DOS 6.0+', 'Description': 'Secured FAT16 '},
'C5': {'OS': 'DR DOS 6.0+', 'Description': 'Secured extended partition with CHS addressing '},
'C6': {'OS': 'DR DOS 6.0+ / Windows NT 4 Server', 'Description': 'Secured FAT16B / Corrupted fault-tolerant FAT16B mirrored slave volume '},
'C7': {'OS': 'Syrinx / Windows NT 4 Server', 'Description': 'Syrinx boot / Corrupted fault-tolerant HPFS/NTFS mirrored slave volume '},
'C8': {'Description': 'Reserved for DR-DOS since 1997'},
'C9': {'Description': 'Reserved for DR-DOS since 1997'},
'CA': {'Description': 'Reserved for DR-DOS since 1997'},
'CB': {'OS': 'DR-DOS 7.0x / Windows NT 4 Server', 'Description': 'Secured FAT32 / Corrupted fault-tolerant FAT32 mirrored slave volume '},
'CC': {'OS': 'DR-DOS 7.0x / Windows NT 4 Server', 'Description': 'Secured FAT32 / Corrupted fault-tolerant FAT32 mirrored slave volume '},
'CD': {'OS': 'CTOS', 'Description': 'Memory dump'},
'CE': {'OS': 'DR-DOS 7.0x', 'Description': 'Secured FAT16B '},
'CF': {'OS': 'DR-DOS 7.0x', 'Description': 'Secured extended partition with LBA '},
'D0': {'OS': 'Multiuser DOS, REAL/32', 'Description': 'Secured FAT partition (larger than 32 MB)'},
'D1': {'OS': 'Multiuser DOS', 'Description': 'Secured FAT12 '},
'D4': {'OS': 'Multiuser DOS', 'Description': 'Secured FAT16 '},
'D5': {'OS': 'Multiuser DOS', 'Description': 'Secured extended partition with CHS addressing '},
'D6': {'OS': 'Multiuser DOS', 'Description': 'Secured FAT16B '},
'D8': {'OS': 'Digital Research', 'Description': 'CP/M-86 [citation needed]'},
'DA': {'OS': 'Powercopy Backup', 'Description': 'Non-file system data / Shielded disk'},
'DB': {'OS': 'CP/M-86,Concurrent CP/M-86,Concurrent DOS / CTOS / D800 / DRMK', 'Description': 'CP/M-86, Concurrent CP/M-86, Concurrent DOS / boot image for x86 supervisor CPU (SCPU) module / FAT32 system restore partition (DSR)'},
'DD': {'OS': 'CTOS', 'Description': 'Hidden memory dump'},
'DE': {'OS': 'Dell', 'Description': 'FAT16 utility/diagnostic partition'},
'DF': {'OS': 'DG/UX / BootIt / Aviion', 'Description': 'DG/UX virtual disk manager / EMBRM'},
'E0': {'OS': 'STMicroelectronics', 'Description': 'ST AVFS'},
'E1': {'OS': 'SpeedStor', 'Description': 'Extended FAT12 (> 1023 cylinder)'},
'E2': {'Description': 'DOS read-only (XFDISK)'},
'E3': {'OS': 'SpeedStor', 'Description': 'DOS read-only'},
'E4': {'OS': 'SpeedStor', 'Description': 'Extended FAT16 (< 1024 cylinder)'},
'E5': {'OS': 'Tandy MS-DOS', 'Description': 'Logical sectored 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 can be a FAT12, FAT16, FAT32 (or other) file system'},
'F0': {'OS': 'Linux / OS/32', 'Description': 'PA-RISC Linux boot loader. It must reside in first physical 2 GB. / floppy'},
'F1': {'OS': 'SpeedStor', 'Description': 'Unknown'},
'F2': {'OS': 'Sperry IT MS-DOS 3.x, Unisys MS-DOS 3.3, Digital ResearchDOS Plus 2.1', 'Description': 'Logical sectored FAT12 or FAT16 secondary partition'},
'F3': {'OS': 'SpeedStor', 'Description': 'Unknown'},
'F4': {'OS': 'SpeedStor / Prologue', 'Description': '"large" DOS partition / single volume partition for NGF or TwinFS'},
'F5': {'OS': 'Prologue', 'Description': 'MD0-MD9 multi volume partition for NGF or TwinFS'},
'F6': {'OS': 'SpeedStor', 'Description': 'Unknown'},
'F7': {'OS': 'O.S.G. / X1', 'Description': 'EFAT / Solid State file system'},
'F9': {'OS': 'Linux', 'Description': 'pCache ext2/ext3 persistent cache'},
'FA': {'OS': 'Bochs', 'Description': 'x86 emulator'},
'FB': {'OS': 'VMware', 'Description': 'VMware VMFS file system partition'},
'FC': {'OS': 'VMware', 'Description': 'VMware swap / VMKCORE kernel dump partition'},
'FD': {'OS': 'Linux / FreeDOS', 'Description': 'Linux RAID superblock with auto-detect / Reserved for FreeDOS'},
'FE': {'OS': 'SpeedStor / LANstep / Windows NT / Linux', 'Description': 'partition > 1024 cylinder / PS/2 IML partition / PS/2 recovery partition (FAT12 reference disk floppy image), / Disk Administration hidden partition / old Linux LVM'},
'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(), None)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,6 +0,0 @@
[LaunchApp]
[LaunchApps]
wpeinit
wpeutil updatebootinfo
cd /d "%SystemDrive%\WK"
"%SystemDrive%\WK\ConEmu\ConEmu.exe", /cmd cmd /k cd "%SystemDrive%\WK" & python "%SystemDrive%\WK\Scripts\menu.py"

View file

@ -1,2 +0,0 @@
@echo off
python "%SystemDrive%\WK\Scripts\menu.py"

View file

@ -1,20 +0,0 @@
[CPU-Z]
VERSION=1.7.7.0
TextFontName=
TextFontSize=14
TextFontColor=000080
LabelFontName=
LabelFontSize=14
ACPI=1
PCI=1
MaxPCIBus=256
DMI=1
Sensor=1
SMBus=1
Display=1
UseDisplayAPI=1
BusClock=1
Chipset=1
SPD=1
XOC=0
CheckUpdates=0

View file

@ -1,209 +0,0 @@
[LogfileSettings]
COMP=1
COMP_SP=1
COMP_Name=1
COMP_Os=1
COMP_User=0
CPU=1
CPU_Name=1
CPU_ID=1
CPU_Vendor=1
CPU_Stepping=1
CPU_Type=1
CPU_BrandID=1
CPU_PN=1
CPU_Clock=1
CPU_MaxFreq=1
CPU_CacheL1=1
CPU_CacheL2=1
CPU_TLB_I=1
CPU_TLB_D=1
CPU_Features=1
CPU_PIROM=1
MEM=1
MEM_TotalSize=1
MEM_Timing=1
MEM_Row=1
MEM_Row_Size=1
MEM_Row_Type=1
MEM_Row_Speed=1
MEM_Row_Model=1
MEM_Row_ECC=1
MEM_Row_Date=1
MEM_Row_SN=1
MEM_Row_Cfg=1
MEM_Row_Latency=1
MEM_Row_Features=1
MEM_Row_iFeatures=1
BUS=1
BUS_PCI=1
BUS_PCI_DevName=1
BUS_PCI_DevNumber=1
BUS_PCI_Resources=1
BUS_PCI_Features=1
BUS_PCI_DevSpecific=1
BUS_PCIX_Features=1
BUS_PCIe_Features=1
BUS_PCI_DRV_INFO=1
BUS_EISA=1
DMI=1
DMI_0=1
DMI_1=1
DMI_2=1
DMI_3=1
DMI_4=1
DMI_5=1
DMI_6=1
DMI_7=1
DMI_8=1
DMI_9=1
DMI_10=1
DMI_11=1
DMI_12=1
DMI_13=1
DMI_14=1
DMI_15=1
DMI_16=1
DMI_17=1
DMI_18=1
DMI_19=1
DMI_20=1
DMI_21=1
DMI_22=1
DMI_23=1
DMI_24=1
DMI_25=1
DMI_26=1
DMI_27=1
DMI_28=1
DMI_29=1
DMI_30=1
DMI_31=1
DMI_32=1
DMI_33=1
DMI_34=1
DMI_35=1
DMI_36=1
DMI_37=1
DMI_38=1
DMI_39=1
DMI_129=1
DMI_130=1
DMI_131=1
VIDEO=1
VIDEO_Chipset=1
VIDEO_Memory=1
VIDEO_Card=1
VIDEO_Bus=1
VIDEO_RAMDAC=1
VIDEO_BIOSver=1
VIDEO_Clock=1
VIDEO_HWID=1
VIDEO_DRV_INFO=1
VIDEO_DirectX=1
MON=1
MON_Name=1
MON_SN=1
MON_Date=1
MON_Dimensions=1
MON_DisplayType=1
MON_InputSignal=1
MON_Gamma=1
MON_DPMSinput=1
MON_DPMSmodes=1
MOBO=1
MOBO_Model=1
MOBO_Chipset=1
MOBO_CompName=1
MOBO_MachineType=1
MOBO_Slots=1
MOBO_BIOS_Manuf=1
MOBO_BIOS_Date=1
MOBO_PNP_Devs=1
MOBO_PNP_Nodes=1
MOBO_ACPI_Devs=1
MOBO_ACPI_Enum=1
DRIVE=1
DRIVE_IDE=1
DRIVE_IDE_Ctrller=1
DRIVE_IDE_Channel=1
DRIVE_IDE_Model=1
DRIVE_IDE_Rev=1
DRIVE_IDE_SN=1
DRIVE_IDE_Capacity=1
DRIVE_IDE_Geometry=1
DRIVE_IDE_Cache=1
DRIVE_IDE_Xfer=1
DRIVE_IDE_BasicCapab=1
DRIVE_IDE_ATA2Capab=1
DRIVE_IDE_SMART=1
DRIVE_SCSI=1
DRIVE_SCSI_ID=1
DRIVE_SCSI_Desc=1
DRIVE_SCSI_Class=1
DRIVE_Floppy=1
NETWORK=1
NETWORK_HWID=1
NETWORK_DRV_INFO=1
AUDIO=1
AUDIO_DRV_INFO=1
AUDIO_HWID=1
PORTS=1
BUS_USB=1
BUS_USB_DRV_INFO=1
BATTERY=1
SENSORS=1
[Settings]
HighestIdeAddress=0
AcpiEnum=0
SWSMI=1
DebugMode=0
SMBus=1
TempScale=C
AC97CodecID=1
SkipProblematicPciDev=0
GPUI2C=1
LPC=1
DefReportType=5
TPM=0
PCIdirect=1
OpenSystemSummary=0
RememberPreferences=1
LargeFonts=0
OpenSensors=0
MinimalizeMainWnd=0
MinimalizeSensors=0
PersistentDriver=0
UseHPET=1
AutoUpdate=0
GPUI2CNVAPI=1
GPUI2CADL=0
SensorsOnly=0
AcpiEval=1
CpuClkFromBusClk=1
BusClkPolling=1
SMBusAdrExclude=11111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000
GPUI2CBusExclude=00000000
SensorsSM=1
IoctlKernel=0
SummaryOnly=0
WakeGPUs=1
KeepTheme=0
FlushBuffers=1
iMEsupport=1
GPUI2Ccaching=1
CSMI_SAS_Support=1
DebugDirect=1
MinimalizeSensorsClose=0
WakeGPUsExt=0
PollSleepingGPUs=0
ShowWelcomeAndProgress=1
EnablePchTherm=0
ReorderGPUs=1
NvmlSupport=1
DecimalSeparator=.
ThousandsSeparator=,
CsvSeparator=,
MinimizeGraphs=1
TextButtons=0

View file

@ -1,69 +0,0 @@
[Start]
m_lang_id=1
QDir_Id=0
useColorStart=1
Als=12
designe_mode=2
WinRC=66;87;1026;761
showCmd=3
StartCrash=0
default_tab=
Max=1
show_ext_in_type=1
title_info=1
adresbar_style=1
useTreeColor=1
useColor=1
[Favoriten]
Ordner=.\Favoriten\
[Q]
Link=.\Favoriten\Quick-Link\
[Q-Dir]
Lizenz=1
[Vorschau]
Filter=*.avi;*.bmp;*.gif;*.ico;*.jpeg;*.jpg;*.mp*;*.pdf;*.png;*.wm*;
[Filter2]
0=#Hidden=1=-1=1=1=-1=0
1=*.zip;*.rar;*.gz;*.7z;=1=00AA00=-1=1=-1=0
2=*.mp*;*.avi;*.wma;=1=DD0058=-1=1=-1=0
3=#DIR=1=008800=-1=1=-1=0
4=*.jpg;*.jpeg;*.png,*.gif;*.bmp;*.ico=1=BB00BB=-1=1=-1=0
5=*.html;*.htm;*.url=1=456789=-1=1=-1=0
6=*.pl;*.cgi;*.php;*.pdf;*.doc;*.rtf;*.xls=1=BB8844=-1=1=-1=0
7=*.cpp;*.hpp;*.h=1=DD0058=-1=1=-1=0
8=*.exe;*.dll;*.bat=1=FF0000=-1=1=-1=0
9=*=1=0000BB=-1=1=-1=0
10=#BG=1=-1=-1=1=-1=0
11=#BG-A=1=-1=-1=1=-1=0
[Ordner]
Filter=
[Column_OS_6.1_Ploder1]
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
Spatlen_291=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%00%00%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%EE%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0E%00%00%00%69%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%91%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0C%00%00%00%46%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%00%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-563719693|772
[Column_OS_6.1_Ploder2]
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
[Column_OS_6.1_Ploder3]
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
[Column_OS_6.1_Ploder4]
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
[Programs_State]
Disable=0
[Quick-Links]
WK=%systemdrive%/WK
[Options]
Start=7
[X-Size]
mode=1
dig=0
fld_size=1
ths_sep=1
type=0
precent=1
ff_cnt=1
block_no_focus=1
nosort_fld_size=1

View file

@ -1,20 +0,0 @@
[CPU-Z]
VERSION=1.7.7.0
TextFontName=
TextFontSize=14
TextFontColor=000080
LabelFontName=
LabelFontSize=14
ACPI=1
PCI=1
MaxPCIBus=256
DMI=1
Sensor=1
SMBus=1
Display=1
UseDisplayAPI=1
BusClock=1
Chipset=1
SPD=1
XOC=0
CheckUpdates=0

View file

@ -1,69 +0,0 @@
[Start]
m_lang_id=1
QDir_Id=0
useColorStart=1
Als=12
designe_mode=2
WinRC=8;15;968;689
showCmd=3
StartCrash=0
default_tab=
Max=1
show_ext_in_type=1
title_info=1
adresbar_style=1
useTreeColor=1
useColor=1
[Favoriten]
Ordner=.\Favoriten\
[Q]
Link=.\Favoriten\Quick-Link\
[Q-Dir]
Lizenz=1
[Vorschau]
Filter=*.avi;*.bmp;*.gif;*.ico;*.jpeg;*.jpg;*.mp*;*.pdf;*.png;*.wm*;
[Filter2]
0=#Hidden=1=-1=1=1=-1=0
1=*.zip;*.rar;*.gz;*.7z;=1=00AA00=-1=1=-1=0
2=*.mp*;*.avi;*.wma;=1=DD0058=-1=1=-1=0
3=#DIR=1=008800=-1=1=-1=0
4=*.jpg;*.jpeg;*.png,*.gif;*.bmp;*.ico=1=BB00BB=-1=1=-1=0
5=*.html;*.htm;*.url=1=456789=-1=1=-1=0
6=*.pl;*.cgi;*.php;*.pdf;*.doc;*.rtf;*.xls=1=BB8844=-1=1=-1=0
7=*.cpp;*.hpp;*.h=1=DD0058=-1=1=-1=0
8=*.exe;*.dll;*.bat=1=FF0000=-1=1=-1=0
9=*=1=0000BB=-1=1=-1=0
10=#BG=1=-1=-1=1=-1=0
11=#BG-A=1=-1=-1=1=-1=0
[Ordner]
Filter=
[Column_OS_6.1_Ploder1]
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
Spatlen_291=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%00%00%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%EE%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0E%00%00%00%69%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%91%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0C%00%00%00%46%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%00%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-563719693|772
[Column_OS_6.1_Ploder2]
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
[Column_OS_6.1_Ploder3]
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
[Column_OS_6.1_Ploder4]
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
[Programs_State]
Disable=0
[Quick-Links]
WK=%systemdrive%/WK
[Options]
Start=7
[X-Size]
mode=1
dig=0
fld_size=1
ths_sep=1
type=0
precent=1
ff_cnt=1
block_no_focus=1
nosort_fld_size=1

BIN
images/ConEmu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

BIN
images/Linux.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
images/Pxelinux.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
images/Syslinux.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
images/WinPE.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

BIN
images/WizardHat.xcf Normal file

Binary file not shown.

122
images/logo.svg Normal file
View file

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
id="svg2"
version="1.1"
inkscape:version="0.91 r"
sodipodi:docname="logo.svg"
inkscape:export-filename="/home/thewizardpp/projects/logos/logo512x512.png"
inkscape:export-xdpi="1440"
inkscape:export-ydpi="1440">
<defs
id="defs4">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective10" />
<filter
id="filter3668"
inkscape:label="Drop shadow"
width="1.5"
height="1.5"
x="-.25"
y="-.25">
<feGaussianBlur
id="feGaussianBlur3670"
in="SourceAlpha"
stdDeviation="1,000000"
result="blur" />
<feColorMatrix
id="feColorMatrix3672"
result="bluralpha"
type="matrix"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0,500000 0 " />
<feOffset
id="feOffset3674"
in="bluralpha"
dx="1,000000"
dy="1,000000"
result="offsetBlur" />
<feMerge
id="feMerge3676">
<feMergeNode
id="feMergeNode3678"
in="offsetBlur" />
<feMergeNode
id="feMergeNode3680"
in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="15.839192"
inkscape:cx="16.469461"
inkscape:cy="15.775995"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:window-width="1152"
inkscape:window-height="844"
inkscape:window-x="-2"
inkscape:window-y="93"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer"
style="display:inline">
<g
id="g3613"
transform="matrix(1.0696952,0,0,1.0696952,-1.9682871,1.2767394)">
<path
sodipodi:nodetypes="cssssss"
d="m 28.466519,15.480445 c -1.690444,-0.411311 -3.880242,0.0024 -6.862802,1.703057 -4.343818,2.477 -5.647804,4.7124 -10.531132,6.5262 -2.7416801,1.0184 -7.1725478,1.2727 -6.7296333,-1.9563 0.4055207,-2.9564 4.8746766,-5.683963 10.7473903,-5.268022 7.253753,0.513753 7.780294,2.643843 11.236758,2.445771 4.073631,-0.233438 3.02577,-3.235043 2.139419,-3.450706 z"
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path2822"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccscsc"
id="path2832"
d="m 22.349625,16.595174 c -5.498466,2.959917 -4.603518,5.10607 -10.999048,3.821601 1.40216,-4.418086 4.962036,-16.95097 7.147841,-17.2692571 1.878431,-0.2735287 4.924495,4.2931483 4.924495,4.2931483 0,0 -3.661803,-2.9673231 -4.16688,-1.7046325 -0.593183,1.4829546 2.39459,8.4145833 3.093592,10.8591403 z"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
sodipodi:nodetypes="ccc"
id="path3611"
d="m 22.074942,15.74979 c 1.515307,-0.313608 1.831341,-0.3546 3.377477,-0.485523 1.799175,-0.173029 3.187957,0.237433 3.187957,0.237433"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
images/macOS.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
images/rEFInd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

177
make.cmd
View file

@ -1,177 +0,0 @@
@echo off
:Init
setlocal EnableDelayedExpansion
title WK-WinPE creation tool
color 1b
pushd %~dp0
:Flags
for %%f in (%*) do (
if /i "%%f" == "/DEBUG" (@echo on)
)
:GetDate
:: Credit to SS64.com Code taken from http://ss64.com/nt/syntax-getdate.html
:: Use WMIC to retrieve date and time in ISO 8601 format.
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
IF "%%~L"=="" goto s_done
Set _yyyy=%%L
Set _mm=00%%J
Set _dd=00%%G
Set _hour=00%%H
SET _minute=00%%I
)
:s_done
:: Pad digits with leading zeros
Set _mm=%_mm:~-2%
Set _dd=%_dd:~-2%
Set _hour=%_hour:~-2%
Set _minute=%_minute:~-2%
Set iso_date=%_yyyy%-%_mm%-%_dd%
:Variables
set "wd=%cd%"
set "winpe_ocs=%programfiles(x86)%\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment"
set "pe_out=!wd!\pe_out"
:CheckForCleanup
echo Scanning for old build folders...
set "found_old="
if exist "!wd!\mount" (
echo. Found: "!wd!\mount"
set "found_old=true"
)
if exist "!wd!\pe_files" (
echo. Found: "!wd!\pe_files"
set "found_old=true"
)
if defined found_old (
goto Cleanup
) else (
echo. No build folders found.
)
goto :BuildBoth
:Cleanup
echo.
choice /t 30 /c YN /d N /m "Delete the above folders?"
if %errorlevel% neq 1 goto Abort
rmdir /s /q "!wd!\mount"
rmdir /s /q "!wd!\pe_files"
:BuildBoth
for %%a in (amd64 x86) do (
rem set vars
set "arch=%%a"
set "drivers=!wd!\Drivers\!arch!"
set "mount=!wd!\mount\!arch!"
set "pe_files=!wd!\pe_files\!arch!"
set "winpe_ocs=%programfiles(x86)%\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\!arch!\WinPE_OCs"
rem Copy main files
call copype.cmd !arch! "!pe_files!"
for %%t in (bg-bg cs-cz da-dk de-de el-gr en-gb es-es es-mx et-ee fi-fi fr-ca fr-fr hr-hr hu-hu it-it ja-jp ko-kr lt-lt lv-lv nb-no nl-nl pl-pl pt-br pt-pt ro-ro ru-ru sk-sk sl-si sr-latn-cs sr-latn-rs sv-se tr-tr uk-ua zh-cn zh-hk zh-tw) do (
rmdir /s /q "!pe_files!\media\%%t"
rmdir /s /q "!pe_files!\media\Boot\%%t"
rmdir /s /q "!pe_files!\media\EFI\Microsoft\Boot\%%t"
)
rem Mount Image
mkdir "!mount!"
dism /mount-image /imagefile:"!pe_files!\media\sources\boot.wim" /index:1 /mountdir:"!mount!" /logpath:"dism.log"
rem Add Packages - More info: https://msdn.microsoft.com/en-us/library/windows/hardware/dn938382.aspx
dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\WinPE-EnhancedStorage.cab" /logpath:"dism.log"
dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\WinPE-FMAPI.cab" /logpath:"dism.log"
dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\WinPE-WMI.cab" /logpath:"dism.log"
dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\en-us\WinPE-EnhancedStorage_en-us.cab" /logpath:"dism.log"
dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\en-us\WinPE-WMI_en-us.cab" /logpath:"dism.log"
rem rem Install WinPE-WMI before you install WinPE-NetFX.
rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\WinPE-NetFx.cab" /logpath:"dism.log"
rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\en-us\WinPE-NetFx_en-us.cab" /logpath:"dism.log"
rem rem Install WinPE-WMI and WinPE-NetFX before you install WinPE-Scripting.
rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\WinPE-Scripting.cab" /logpath:"dism.log"
rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\en-us\WinPE-Scripting_en-us.cab" /logpath:"dism.log"
rem rem Install WinPE-WMI, WinPE-NetFX, and WinPE-Scripting before you install WinPE-PowerShell.
rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\WinPE-PowerShell.cab" /logpath:"dism.log"
rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\en-us\WinPE-PowerShell_en-us.cab" /logpath:"dism.log"
rem rem Install WinPE-WMI, WinPE-NetFX, WinPE-Scripting, and WinPE-PowerShell before you install WinPE-DismCmdlets.
rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\WinPE-DismCmdlets.cab" /logpath:"dism.log"
rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\en-us\WinPE-DismCmdlets_en-us.cab" /logpath:"dism.log"
rem rem Install WinPE-WMI, WinPE-NetFX, WinPE-Scripting, and WinPE-PowerShell before you install WinPE-SecureBootCmdlets.
rem rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\WinPE-SecureBootCmdlets.cab" /logpath:"dism.log"
rem rem Install WinPE-WMI, WinPE-NetFX, WinPE-Scripting, and WinPE-PowerShell before you install WinPE-StorageWMI.
rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\WinPE-StorageWMI.cab" /logpath:"dism.log"
rem dism /add-package /image:"!mount!" /packagepath:"!winpe_ocs!\en-us\WinPE-StorageWMI_en-us.cab" /logpath:"dism.log"
rem Add Drivers
REM dism /add-driver /image:"!mount!" /driver:"!drivers!" /recurse /logpath:"dism.log"
rem Force RamDisk size to try and avoid capture-image errors
dism /image:"!mount!" /set-scratchspace:512
rem Add WK Stuff
del "!wd!\WK\Scripts\WK.log"
mkdir "!mount!\WK"
robocopy /s /r:3 /w:0 "!wd!\WK\!arch!" "!mount!\WK"
mkdir "!mount!\WK\Scripts"
robocopy /s /r:3 /w:0 "!wd!\Scripts" "!mount!\WK\Scripts"
rem Add System32 Stuff
copy /y "!wd!\System32\menu.cmd" "!mount!\Windows\System32\menu.cmd"
copy /y "!wd!\System32\Winpeshl.ini" "!mount!\Windows\System32\Winpeshl.ini"
rem Background
takeown /f "!mount!\Windows\System32\winpe.jpg" /a
icacls "!mount!\Windows\System32\winpe.jpg" /grant administrators:F
copy /y "!wd!\System32\winpe.jpg" "!mount!\Windows\System32\winpe.jpg"
copy /y "!wd!\System32\winpe.jpg" "!mount!\WK\ConEmu\ConEmu.jpg"
rem Registry Edits
reg load HKLM\WinPE-SW "!mount!\Windows\System32\config\SOFTWARE"
reg load HKLM\WinPE-SYS "!mount!\Windows\System32\config\SYSTEM"
rem Add 7-Zip and Python to path
reg add "HKLM\WinPE-SYS\ControlSet001\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d "%%SystemRoot%%\system32;%%SystemRoot%%;%%SystemRoot%%\System32\Wbem;%%SYSTEMROOT%%\System32\WindowsPowerShell\v1.0\;%%SystemDrive%%\WK\7-Zip;%%SystemDrive%%\WK\python;%%SystemDrive%%\WK\wimlib" /f
rem Replace Notepad
reg add "HKLM\WinPE-SW\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v Debugger /t REG_SZ /d "X:\WK\NotepadPlusPlus\notepadplusplus.exe /z" /f
rem Unload registry hives
reg unload HKLM\WinPE-SW
reg unload HKLM\WinPE-SYS
rem Unmount Image
dism /unmount-image /mountdir:"!mount!" /commit
rem Create ISO
del "wk-winpe-!iso_date!-!arch!.iso"
call makewinpemedia.cmd /iso "!pe_files!" "wk-winpe-!iso_date!-!arch!.iso"
)
goto Done
:Abort
color 4e
echo.
echo Aborted.
goto Exit
:Done
echo.
echo Done.
goto Exit
:Exit
echo.
echo Press any key to exit...
pause>nul
popd
color
endlocal

508
scripts/Launch.cmd Normal file
View file

@ -0,0 +1,508 @@
:: WizardKit: Wrapper for launching programs and scripts.
::
:: Some features:
:: * If the OS is 64-bit then the WorkingDir is scanned for a 64-bit version of the programs
:: * Allows for centralized terminal emulation settings management
:: * Allows for smaller "launcher" scripts to be used as they will rely on this script.
@echo off
if defined DEBUG (@echo on)
:Init
setlocal EnableDelayedExpansion
title WizardKit: Launcher
pushd "%~dp0"
call :FindBin
call :DeQuote L_ITEM
call :DeQuote L_PATH
call :DeQuote L_TYPE
:SetVariables
rem Set variables using settings\main.py file
set "SETTINGS=%bin%\Scripts\wk\cfg\main.py"
for %%v in (ARCHIVE_PASSWORD KIT_NAME_FULL OFFICE_SERVER_IP QUICKBOOKS_SERVER_IP) do (
set "var=%%v"
for /f "tokens=* usebackq" %%f in (`findstr "!var!=" "%SETTINGS%"`) do (
set "_v=%%f"
set "_v=!_v:*'=!"
set "%%v=!_v:~0,-1!"
)
)
rem Set ARCH to 32 as a gross assumption and check for x86_64 status
set ARCH=32
if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" set "ARCH=64"
set "SEVEN_ZIP=%bin%\7-Zip\7z.exe"
set "CON=%bin%\ConEmu\ConEmu.exe"
set "FASTCOPY=%bin%\FastCopy\FastCopy.exe"
set "POWERSHELL=%systemroot%\system32\WindowsPowerShell\v1.0\powershell.exe"
set "PYTHON=%bin%\Python\x32\python.exe"
if %ARCH% equ 64 (
set "CON=%bin%\ConEmu\ConEmu64.exe"
set "FASTCOPY=%bin%\FastCopy\FastCopy64.exe"
set "PYTHON=%bin%\Python\x64\python.exe"
)
:UpdateTitle
rem Sets title using KIT_NAME_FULL from settings\main.py (unless %window_title% already set)
if defined window_title (
title %window_title%
) else (
set "window_title=%*"
if not defined window_title set "window_title=Launcher"
set "window_title=%KIT_NAME_FULL%: %window_title%"
title %window_title%
)
:CheckUsage
rem Check for empty passed variables
if not defined L_TYPE (goto Usage)
if not defined L_PATH (goto Usage)
if not defined L_ITEM (goto Usage)
rem Assume if not "True" then False (i.e. undefine variable)
if /i not "%L_ELEV%" == "True" (set "L_ELEV=")
if /i not "%L_NCMD%" == "True" (set "L_NCMD=")
if /i not "%L__CLI%" == "True" (set "L__CLI=")
:RelaunchInConEmu
set RELOAD_IN_CONEMU=True
if defined ConEmuBuild set "RELOAD_IN_CONEMU="
if defined L_NCMD set "RELOAD_IN_CONEMU="
if "%L_TYPE%" == "Executable" set "RELOAD_IN_CONEMU="
if "%L_TYPE%" == "PSScript" set "RELOAD_IN_CONEMU="
if "%L_TYPE%" == "PyScript" set "RELOAD_IN_CONEMU="
if defined RELOAD_IN_CONEMU (
set "con_args=-new_console:n"
rem If in DEBUG state then force ConEmu to stay open
if defined DEBUG (set "con_args=!con_args! -new_console:c")
start "" "%CON%" -run ""%~0" %*" !con_args! || goto ErrorUnknown
exit /b 0
)
:CheckLaunchType
rem Jump to the selected launch type or show usage
if /i "%L_TYPE%" == "Executable" (goto LaunchExecutable)
if /i "%L_TYPE%" == "Folder" (goto LaunchFolder)
if /i "%L_TYPE%" == "Office" (goto LaunchOffice)
if /i "%L_TYPE%" == "PSScript" (goto LaunchPSScript)
if /i "%L_TYPE%" == "PyScript" (goto LaunchPyScript)
if /i "%L_TYPE%" == "QuickBooks" (goto LaunchQuickBooksSetup)
goto Usage
:LaunchExecutable
rem Prep
call :ExtractOrFindPath || goto ErrorProgramNotFound
rem Check for 64-bit prog (if running on 64-bit system)
set "prog=%_path%\%L_ITEM%"
if %ARCH% equ 64 (
if exist "%_path%\%L_ITEM:.=64.%" set "prog=%_path%\%L_ITEM:.=64.%"
) else (
if exist "%_path%\%L_ITEM:.=32.%" set "prog=%_path%\%L_ITEM:.=32.%"
)
if not exist "%prog%" goto ErrorProgramNotFound
rem Run
popd && pushd "%_path%"
if defined L__CLI goto LaunchExecutableCLI
if defined L_ELEV (
goto LaunchExecutableElev
) else (
goto LaunchExecutableUser
)
:LaunchExecutableCLI
rem Prep
set "con_args=-new_console:n"
if defined DEBUG (set "con_args=%con_args% -new_console:c")
if defined L_ELEV (set "con_args=%con_args% -new_console:a")
rem Run
start "" "%CON%" -run "%prog%" %L_ARGS% %con_args% || goto ErrorUnknown
goto Exit
:LaunchExecutableElev
rem Prep
call :DeQuote prog
call :DeQuote L_ARGS
rem Create VB script
mkdir "%bin%\tmp" 2>nul
echo Set UAC = CreateObject^("Shell.Application"^) > "%bin%\tmp\Elevate.vbs"
echo UAC.ShellExecute "%prog%", "%L_ARGS%", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
rem Run
"%systemroot%\System32\cscript.exe" //nologo "%bin%\tmp\Elevate.vbs" || goto ErrorUnknown
goto Exit
:LaunchExecutableUser
rem Run
start "" "%prog%" %L_ARGS% || goto ErrorUnknown
goto Exit
:LaunchFolder
rem Prep
call :ExtractOrFindPath || goto ErrorProgramNotFound
rem Run
start "" "explorer.exe" "%_path%" || goto ErrorUnknown
goto Exit
:LaunchOffice
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 (
goto LaunchOfficeSetup
)
:LaunchOfficeODT
rem Prep
set "args=-aoa -bso0 -bse0 -bsp0 -p%ARCHIVE_PASSWORD%"
set "config=%L_ITEM%"
set "dest=%client_dir%\Office\ODT"
set "odt_exe=setup.exe"
set "source=%cbin%\_Office.7z"
rem Extract
if not exist "%source%" (goto ErrorODTSourceNotFound)
"%SEVEN_ZIP%" e "%source%" %args% -o"%dest%" %odt_exe% %config% || exit /b 1
"%systemroot%\System32\ping.exe" -n 2 127.0.0.1>nul
rem Verify
if not exist "%dest%\setup.exe" (goto ErrorODTSourceNotFound)
if not exist "%dest%\%config%" (goto ErrorODTSourceNotFound)
pushd "%dest%"
rem Run
rem # The line below jumps to ErrorUnknown even when it runs correctly??
rem start "" "setup.exe" /configure %L_ITEM% || popd & goto ErrorUnknown
rem # Going to assume it extracted correctly and blindly start setup.exe
start "" "setup.exe" /configure %config%
popd
goto Exit
:LaunchOfficeSetup
rem Prep
set "fastcopy_args=/cmd=diff /no_ui /auto_close"
set "product=%L_PATH%\%L_ITEM%"
set "product_name=%L_ITEM%"
call :GetBasename product_name || goto ErrorBasename
set "source=\\%OFFICE_SERVER_IP%\Office\%product%"
set "dest=%client_dir%\Office"
rem Verify
if not exist "%source%" (goto ErrorOfficeSourceNotFound)
rem Copy
echo Copying setup file(s) for %product_name%...
start "" /wait "%FASTCOPY%" %fastcopy_args% "%source%" /to="%dest%\"
rem Run
if exist "%dest%\%product_name%\setup.exe" (
start "" "%dest%\%product_name%\setup.exe" || goto ErrorUnknown
) else if "%product_name:~-3,3%" == "exe" (
start "" "%dest%\%product_name%" || goto ErrorUnknown
) else if "%product_name:~-3,3%" == "msi" (
start "" "%dest%\%product_name%" || goto ErrorUnknown
) else (
rem Office source not supported by this script
goto ErrorOfficeUnsupported
)
goto Exit
:LaunchPSScript
rem Prep
call :ExtractOrFindPath || goto ErrorProgramNotFound
set "script=%_path%\%L_ITEM%"
set "ps_args=-ExecutionPolicy Bypass -NoProfile"
rem Verify
if not exist "%script%" goto ErrorScriptNotFound
rem Run
popd && pushd "%_path%"
if defined L_ELEV (
goto LaunchPSScriptElev
) else (
goto LaunchPSScriptUser
)
:LaunchPSScriptElev
rem Prep
call :DeQuote script
rem Create VB script
mkdir "%bin%\tmp" 2>nul
echo Set UAC = CreateObject^("Shell.Application"^) > "%bin%\tmp\Elevate.vbs"
if defined L_NCMD (
rem use Powershell's window instead of %CON%
echo UAC.ShellExecute "%POWERSHELL%", "%ps_args% -File "%script%"", "", "runas", 3 >> "%bin%\tmp\Elevate.vbs"
) else (
echo UAC.ShellExecute "%CON%", "-run %POWERSHELL% %ps_args% -File "^"%script%^"" -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
)
rem Run
"%systemroot%\System32\cscript.exe" //nologo "%bin%\tmp\Elevate.vbs" || goto ErrorUnknown
goto Exit
:LaunchPSScriptUser
rem Run
if defined L_NCMD (
start "" "%POWERSHELL%" %ps_args% -File "%script%" || goto ErrorUnknown
) else (
start "" "%CON%" -run "%POWERSHELL%" %ps_args% -File "%script%" -new_console:n || goto ErrorUnknown
)
goto Exit
:LaunchPyScript
rem Prep
call :ExtractOrFindPath || goto ErrorProgramNotFound
set "script=%_path%\%L_ITEM%"
rem Verify
"%PYTHON%" --version >nul || goto ErrorPythonUnsupported
if not exist "%script%" goto ErrorScriptNotFound
rem Run
if defined L_ELEV (
goto LaunchPyScriptElev
) else (
goto LaunchPyScriptUser
)
:LaunchPyScriptElev
rem Prep
call :DeQuote script
rem Create VB script
mkdir "%bin%\tmp" 2>nul
echo Set UAC = CreateObject^("Shell.Application"^) > "%bin%\tmp\Elevate.vbs"
if defined L_NCMD (
echo UAC.ShellExecute "%PYTHON%", """%script%"" %L_ARGS%", "", "runas", 3 >> "%bin%\tmp\Elevate.vbs"
) else (
echo UAC.ShellExecute "%CON%", "-run ""%PYTHON%"" ""%script%"" %L_ARGS% -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
)
rem Run
"%systemroot%\System32\cscript.exe" //nologo "%bin%\tmp\Elevate.vbs" || goto ErrorUnknown
goto Exit
:LaunchPyScriptUser
if defined L_NCMD (
start "" "%PYTHON%" "%script%" %L_ARGS% || goto ErrorUnknown
) else (
start "" "%CON%" -run "%PYTHON%" "%script%" %L_ARGS% -new_console:n || goto ErrorUnknown
)
goto Exit
:LaunchQuickBooksSetup
rem Prep
call "%bin%\Scripts\init_client_dir.cmd" /QuickBooks
set "fastcopy_args=/cmd=diff /no_ui /auto_close"
set "product=%L_PATH%\%L_ITEM%"
set "product_name=%L_ITEM%"
call :GetBasename product_name || goto ErrorBasename
set "source=\\%QUICKBOOKS_SERVER_IP%\QuickBooks\%product%"
set "dest=%client_dir%\QuickBooks"
rem Verify
if not exist "%source%" (goto ErrorQuickBooksSourceNotFound)
rem Copy
echo Copying setup file(s) for %L_ITEM%...
start "" /wait "%FASTCOPY%" %fastcopy_args% "%source%" /to="%dest%\"
rem Run
if exist "%dest%\%product_name%\Setup.exe" (
pushd "%dest%\%product_name%"
start "" "%dest%\%product_name%\Setup.exe" || goto ErrorUnknown
popd
) else (
rem QuickBooks source not supported by this script
goto ErrorQuickBooksUnsupported
)
goto Exit
:Usage
echo.
echo.Usage (via defined variables):
echo. L_TYPE L_PATH L_ITEM L_ARGS
echo. Executable Working Dir Program Args [L_7ZIP] [L_ELEV] [L__CLI]
echo. Folder Folder '.' [L_7ZIP]
echo. Office Year Product [L_7ZIP]
echo. PSScript Scripts Script [L_7ZIP] [L_ELEV] [L_NCMD]
echo. PyScript Scripts Script Args [L_7ZIP] [L_ELEV] [L_NCMD]
echo. QuickBooks Year Product [L_7ZIP]
echo.
echo.L_7ZIP: Extra arguments for 7-Zip (in the :ExtractCBin label)
echo.L_ELEV: Elevate to run as Admin
echo.L_NCMD: Do not run script inside ConEmu (i.e. use the native window)
echo.L__CLI: Run executable in ConEmu
echo.
goto Abort
:: Functions ::
:DeQuote
rem Code taken from http://ss64.com/nt/syntax-dequote.html
if not defined %1 (@exit /b 1)
for /f "delims=" %%a in ('echo %%%1%%') do set %1=%%~a
@exit /b 0
:ExtractCBin
rem Extract %cbin% archive into %bin%
echo Extracting "%L_PATH%"...
set "source=%cbin%\%L_PATH%.7z"
set "dest=%bin%\%L_PATH%"
set "args=-aos -bso0 -bse0 -bsp0 -p%ARCHIVE_PASSWORD%"
if defined DEBUG (set "args=-aos -p%ARCHIVE_PASSWORD%")
"%SEVEN_ZIP%" x "%source%" %args% -o"%dest%" %L_7ZIP% || exit /b 1
ping.exe -n 2 127.0.0.1>nul
exit /b 0
:FindBin
rem Checks the current directory and all parents for the ".bin" folder
rem NOTE: Has not been tested for UNC paths
set bin=
pushd "%~dp0"
:FindBinInner
if exist ".bin" (goto FindBinDone)
if "%~d0\" == "%cd%" (popd & @exit /b 1)
cd ..
goto FindBinInner
:FindBinDone
set "bin=%cd%\.bin"
set "cbin=%cd%\.cbin"
popd
@exit /b 0
:GetBasename
rem Loop over passed variable to remove all text left of the last '\' character
rem NOTE: This function should be called as 'call :GetBasename VarName || goto ErrorBasename' to catch variables that become empty.
for /f "delims=" %%a in ('echo %%%1%%') do (set "_tmp=%%~a")
:GetBasenameInner
set "_tmp=%_tmp:*\=%"
if not defined _tmp (@exit /b 1)
if not "%_tmp%" == "%_tmp:*\=%" (goto GetBasenameInner)
:GetBasenameDone
set "%1=%_tmp%"
@exit /b 0
:ExtractOrFindPath
rem Test L_PATH in the following order:
rem 1: %cbin%\L_PATH.7z (which will be extracted to %bin%\L_PATH)
rem 2: %bin%\L_PATH
rem 3. %L_PATH% (i.e. treat L_PATH as an absolute path)
rem NOTE: This function should be called as 'call :ExtractOrFindPath || goto ErrorProgramNotFound' to catch invalid paths.
set _path=
if exist "%cbin%\%L_PATH%.7z" (
call :ExtractCBin
) else if exist "%cbin%\%L_PATH%\%L_ITEM:~0,-4%.7z" (
call :ExtractCBin
)
if exist "%bin%\%L_PATH%" (set "_path=%bin%\%L_PATH%")
if not defined _path (set "_path=%L_PATH%")
rem Raise error if path is still not available
if not exist "%_path%" (exit /b 1)
exit /b 0
:: Errors ::
:ErrorBasename
echo.
echo ERROR: GetBasename resulted in an empty variable.
goto Abort
:ErrorNoBin
echo.
echo ERROR: ".bin" folder not found.
goto Abort
:ErrorODTSourceNotFound
echo.
echo ERROR: Office Deployment Tool source not found.
goto Abort
:ErrorOfficeSourceNotFound
echo.
echo ERROR: Office source "%L_ITEM%" not found.
goto Abort
:ErrorOfficeUnsupported
rem Source is not an executable nor is a folder with a setup.exe file inside. Open explorer to local setup file(s) instead.
echo.
echo ERROR: Office version not supported by this script.
start "" "explorer.exe" "%client_dir%\Office"
goto Abort
:ErrorPythonUnsupported
rem The Windows installation lacks Windows update KB2999226 needed to run Python
echo.
echo ERROR: Failed to run Python, try installing Windows update KB2999226.
echo NOTE: That update is from October 2015 so this system is SEVERELY outdated
if exist "%bin%\..\Installers\Extras\Windows Updates" (
start "" "explorer.exe" "%bin%\..\Installers\Extras\Windows Updates"
)
goto Abort
:ErrorQuickBooksSourceNotFound
echo.
echo ERROR: QuickBooks source "%L_ITEM%" not found.
goto Abort
:ErrorQuickBooksUnsupported
rem Source is not an executable nor is a folder with a setup.exe file inside. Open explorer to local setup file(s) instead.
echo.
echo ERROR: QuickBooks version not supported by this script.
start "" "explorer.exe" "%client_dir%\QuickBooks"
goto Abort
:ErrorProgramNotFound
echo.
echo ERROR: Program "%prog%" not found.
goto Abort
:ErrorScriptNotFound
echo.
echo ERROR: Script "%script%" not found.
goto Abort
:ErrorUnknown
echo.
echo ERROR: Unknown error encountered.
goto Abort
:Abort
rem Handle color theme for both the native console and ConEmu
if defined ConEmuBuild (
color c4
) else (
color 4e
)
echo Aborted.
echo.
echo DETAILS: L_TYPE: %L_TYPE%
echo. L_PATH: %L_PATH%
echo. L_ITEM: %L_ITEM%
echo. L_ARGS: %L_ARGS%
echo. L_7ZIP: %L_7ZIP%
echo. L_ELEV: %L_ELEV%
echo. L_NCMD: %L_NCMD%
echo. L__CLI: %L__CLI%
echo. CON: %CON%
echo. DEBUG: %DEBUG%
echo. PYTHON: %PYTHON%
echo Press any key to exit...
pause>nul
rem reset color and reset errorlevel to 0
rem NOTE: This is done to avoid causing a ErrorLaunchCMD in the launcher.cmd
color 07
goto Exit
:: Cleanup and exit ::
:Exit
popd
endlocal
exit /b %errorlevel%

View file

@ -0,0 +1,113 @@
:: WizardKit: Launcher Script ::
::
:: This script works by setting env variables and then calling Launch.cmd
:: which inherits the variables. This bypasses batch file argument parsing
:: which is awful.
@echo off
:Init
setlocal EnableDelayedExpansion
title WizardKit: Launcher
call :CheckFlags %*
call :FindBin
call :SetTitle Launcher
:Optional
:: This section is for any work that needs done before launching L_ITEM
rem EXTRA_CODE
:DefineLaunch
:: See %bin%\Scripts\Launch.cmd for details under :Usage label
set L_TYPE=
set L_PATH=
set L_ITEM=
set L_ARGS=
set L__CLI=
set L_7ZIP=
set L_ELEV=
set L_NCMD=
:::::::::::::::::::::::::::::::::::::::::::
:: Do not edit anything below this line! ::
:::::::::::::::::::::::::::::::::::::::::::
:LaunchPrep
rem Verifies the environment before launching item
if not defined bin (goto ErrorNoBin)
if not exist "%bin%\Scripts\Launch.cmd" (goto ErrorLaunchCMDMissing)
:Launch
rem Calls the Launch.cmd script using the variables defined above
call "%bin%\Scripts\Launch.cmd" || goto ErrorLaunchCMD
goto Exit
:: Functions ::
:CheckFlags
rem Loops through all arguments to check for accepted flags
set DEBUG=
for %%f in (%*) do (
if /i "%%f" == "/DEBUG" (@echo on & set "DEBUG=/DEBUG")
)
@exit /b 0
:FindBin
rem Checks the current directory and all parents for the ".bin" folder
rem NOTE: Has not been tested for UNC paths
set bin=
pushd "%~dp0"
:FindBinInner
if exist ".bin" (goto FindBinDone)
if "%~d0\" == "%cd%" (popd & @exit /b 1)
cd ..
goto FindBinInner
:FindBinDone
set "bin=%cd%\.bin"
set "cbin=%cd%\.cbin"
popd
@exit /b 0
:SetTitle
rem Sets title using KIT_NAME_FULL from wk\cfg\main.py
set "SETTINGS=%bin%\Scripts\wk\cfg\main.py"
for /f "tokens=* usebackq" %%f in (`findstr KIT_NAME_FULL "%SETTINGS%"`) do (
set "_v=%%f"
set "_v=!_v:*'=!"
set "KIT_NAME_FULL=!_v:~0,-1!"
)
set "window_title=%*"
if not defined window_title set "window_title=Launcher"
set "window_title=%KIT_NAME_FULL%: %window_title%"
title %window_title%
@exit /b 0
:: Errors ::
:ErrorLaunchCMD
echo.
echo ERROR: Launch.cmd did not run correctly. Try using the /DEBUG flag?
goto Abort
:ErrorLaunchCMDMissing
echo.
echo ERROR: Launch.cmd script not found.
goto Abort
:ErrorNoBin
echo.
echo ERROR: ".bin" folder not found.
goto Abort
:Abort
color 4e
echo Aborted.
echo.
echo Press any key to exit...
pause>nul
color
rem Set errorlevel to 1 by calling color incorrectly
color 00
goto Exit
:: Cleanup and exit ::
:Exit
endlocal
exit /b %errorlevel%

2
scripts/README.md Normal file
View file

@ -0,0 +1,2 @@
# WizardKit: Scripts #

37
scripts/apple-fans Executable file
View file

@ -0,0 +1,37 @@
#!/bin/bash
#
## WizardKit: Apple fan speed tool
SMCPATH="/sys/devices/platform/applesmc.768"
SET_MAX="True"
function usage {
echo "Usage: $(basename "$0") auto|max"
echo " e.g. $(basename "$0") max"
}
# Set mode
case $1 in
auto)
SET_MAX="False";;
max)
SET_MAX="True";;
*)
usage
exit 1;;
esac
if [[ -e "$SMCPATH" ]]; then
if [[ "$SET_MAX" == "True" ]]; then
# Set fans to max RPM
for fan in $SMCPATH/fan*max; do
echo '1' | sudo tee ${fan:0:-4}_manual > /dev/null
cat $fan | sudo tee ${fan:0:-4}_output > /dev/null
done
else
# Set fans to auto
for fan in $SMCPATH/fan*manual; do
echo '0' | sudo tee $fan > /dev/null
done
fi
fi

100
scripts/auto_repairs.py Normal file
View file

@ -0,0 +1,100 @@
"""WizardKit: Auto Repair Tool"""
# vim: sts=2 sw=2 ts=2
from typing import Any
import wk
# Classes
REBOOT_STR = wk.ui.ansi.color_string('Reboot', 'YELLOW')
class MenuEntry():
"""Simple class to allow cleaner code below."""
def __init__(
self,
name: str,
function: str | None = None,
selected: bool = True,
**kwargs):
self.name: str = name
self.details: dict[str, Any] = {
'Function': function,
'Selected': selected,
**kwargs,
}
# STATIC VARIABLES
BASE_MENUS = {
'Groups': {
'Backup Settings': (
MenuEntry('Enable RegBack', 'auto_enable_regback'),
MenuEntry('Enable System Restore', 'auto_system_restore_enable'),
MenuEntry('Set System Restore Size', 'auto_system_restore_set_size'),
MenuEntry('Create System Restore', 'auto_system_restore_create'),
MenuEntry('Backup Browsers', 'auto_backup_browser_profiles'),
MenuEntry('Backup Power Plans', 'auto_backup_power_plans'),
MenuEntry('Reset Power Plans', 'auto_reset_power_plans'),
MenuEntry('Set Custom Power Plan', 'auto_set_custom_power_plan'),
MenuEntry('Backup Registry', 'auto_backup_registry'),
),
'Windows Repairs': (
MenuEntry('Disable Windows Updates', 'auto_windows_updates_disable'),
MenuEntry('Reset Windows Updates', 'auto_windows_updates_reset'),
MenuEntry(REBOOT_STR, 'auto_reboot'),
MenuEntry('CHKDSK', 'auto_chkdsk'),
MenuEntry('DISM RestoreHealth', 'auto_dism'),
MenuEntry('SFC Scan', 'auto_sfc'),
MenuEntry('Clear Proxy Settings', 'auto_reset_proxy'),
MenuEntry('Disable Pending Renames', 'auto_disable_pending_renames'),
MenuEntry('Registry Repairs', 'auto_repair_registry'),
MenuEntry('Reset UAC', 'auto_restore_uac_defaults'),
MenuEntry('Reset Windows Policies', 'auto_reset_windows_policies'),
),
'Malware Cleanup': (
MenuEntry('BleachBit', 'auto_bleachbit'),
MenuEntry('HitmanPro', 'auto_hitmanpro'),
MenuEntry('KVRT', 'auto_kvrt'),
MenuEntry('Windows Defender', 'auto_microsoft_defender'),
MenuEntry('Remove Custom Power Plan', 'auto_remove_power_plan'),
MenuEntry(REBOOT_STR, 'auto_reboot'),
),
'Manual Steps': (
MenuEntry('AdwCleaner', 'auto_adwcleaner'),
MenuEntry('Bulk Crap Uninstaller', 'auto_bcuninstaller'),
MenuEntry('Enable Windows Updates', 'auto_windows_updates_enable'),
),
},
'Options': (
MenuEntry('Kill Explorer', selected=False),
MenuEntry('Run AVRemover (once)'),
MenuEntry('Run RKill'),
MenuEntry('Sync Clock'),
MenuEntry('Use Autologon', selected=False),
),
'Actions': (
MenuEntry('Load Preset'),
MenuEntry('Options'),
MenuEntry('Start', Separator=True),
MenuEntry('Quit'),
),
}
PRESETS = {
'Default': { # Will be expanded at runtime using BASE_MENUS
'Options': (
'Run RKill',
'Sync Clock',
),
},
'Custom': {}, # Will remain empty at runtime
}
if __name__ == '__main__':
try:
wk.repairs.win.run_auto_repairs(BASE_MENUS, PRESETS)
except KeyboardInterrupt:
wk.ui.cli.abort()
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()

175
scripts/auto_setup.py Normal file
View file

@ -0,0 +1,175 @@
"""WizardKit: Auto System Setup Tool"""
# vim: sts=2 sw=2 ts=2
from typing import Any
import wk
# Classes
class MenuEntry():
"""Simple class to allow cleaner code below."""
def __init__(
self,
name: str,
function: str | None = None,
selected: bool = True,
**kwargs):
self.name: str = name
self.details: dict[str, Any] = {
'Function': function,
'Selected': selected,
**kwargs,
}
# STATIC VARIABLES
BASE_MENUS = {
'Groups': {
'Backup Settings': (
MenuEntry('Backup Browsers', 'auto_backup_browser_profiles'),
MenuEntry('Backup Power Plans', 'auto_backup_power_plans'),
MenuEntry('Reset Power Plans', 'auto_reset_power_plans'),
MenuEntry('Set Custom Power Plan', 'auto_set_custom_power_plan'),
),
'Install Software': (
MenuEntry('Winget', 'auto_install_winget'),
MenuEntry('Firefox', 'auto_install_firefox'),
MenuEntry('LibreOffice', 'auto_install_libreoffice', selected=False),
MenuEntry('Open Shell', 'auto_install_open_shell'),
MenuEntry('Software Bundle', 'auto_install_software_bundle'),
MenuEntry('Software Upgrades', 'auto_install_software_upgrades'),
MenuEntry('Visual C++ Runtimes', 'auto_install_vcredists'),
),
'Configure System': (
MenuEntry('Open Shell', 'auto_config_open_shell'),
MenuEntry('Disable Password Expiration', 'auto_disable_password_expiration'),
MenuEntry('Enable BSoD MiniDumps', 'auto_enable_bsod_minidumps'),
MenuEntry('Enable RegBack', 'auto_enable_regback'),
MenuEntry('Enable System Restore', 'auto_system_restore_enable'),
MenuEntry('Set System Restore Size', 'auto_system_restore_set_size'),
MenuEntry('Enable Windows Updates', 'auto_windows_updates_enable'),
MenuEntry('Windows Activation', 'auto_activate_windows'),
MenuEntry('Windows Explorer', 'auto_config_explorer'),
MenuEntry(r'Windows\Temp Fix', 'auto_windows_temp_fix'),
MenuEntry('Configure Browsers', 'auto_config_browsers'),
MenuEntry('Create System Restore', 'auto_system_restore_create'),
),
'System Information': (
MenuEntry('AIDA64 Report', 'auto_export_aida64_report'),
MenuEntry('Backup Registry', 'auto_backup_registry'),
),
'System Summary': (
MenuEntry('Operating System', 'auto_show_os_name'),
MenuEntry('Windows Activation', 'auto_show_os_activation'),
MenuEntry('Secure Boot', 'auto_show_secure_boot_status'),
MenuEntry('Installed RAM', 'auto_show_installed_ram'),
MenuEntry('Storage Status', 'auto_show_storage_status'),
MenuEntry('Virus Protection', 'auto_show_installed_antivirus'),
MenuEntry('Partitions 4K Aligned', 'auto_show_4k_alignment_check'),
),
'Run Programs': (
MenuEntry('Device Manager', 'auto_open_device_manager'),
MenuEntry('HWiNFO Sensors', 'auto_open_hwinfo_sensors'),
MenuEntry('Microsoft Store Updates', 'auto_open_microsoft_store_updates'),
MenuEntry('Snappy Driver Installer', 'auto_open_snappy_driver_installer_origin'),
MenuEntry('Windows Activation', 'auto_open_windows_activation'),
MenuEntry('Windows Updates', 'auto_open_windows_updates'),
MenuEntry('XMPlay', 'auto_open_xmplay'),
),
},
'Actions': (
MenuEntry('Load Preset'),
MenuEntry('Start', Separator=True),
MenuEntry('Quit'),
),
}
PRESETS = {
'Default': {}, # Will be built at runtime using BASE_MENUS
'Additional User': {
'Configure System': (
'Configure Browsers',
'Open Shell',
'uBlock Origin',
'Enable BSoD MiniDumps',
'Enable RegBack',
'Enable System Restore',
'Set System Restore Size',
'Enable Windows Updates',
'Windows Explorer',
),
'Install Software': (
'Firefox', # Needed to handle profile upgrade nonsense
),
'Run Programs': (
'Microsoft Store Updates',
),
'System Summary': (
'Operating System',
'Windows Activation',
'Secure Boot',
'Installed RAM',
'Storage Status',
'Virus Protection',
'Partitions 4K Aligned',
),
},
'Hardware': {
'Configure System': (
'Enable BSoD MiniDumps',
'Enable RegBack',
'Enable System Restore',
'Set System Restore Size',
'Enable Windows Updates',
),
'System Information': (
'Backup Registry',
),
'System Summary': (
'Operating System',
'Windows Activation',
'Secure Boot',
'Installed RAM',
'Storage Status',
'Virus Protection',
'Partitions 4K Aligned',
),
'Run Programs': (
'Device Manager',
'HWiNFO Sensors',
'XMPlay',
),
},
'Verify': {
'Configure System': (
'Enable BSoD MiniDumps',
'Enable RegBack',
'Enable System Restore',
'Set System Restore Size',
'Enable Windows Updates',
'Windows Explorer',
),
'System Summary': (
'Operating System',
'Windows Activation',
'Secure Boot',
'Installed RAM',
'Storage Status',
'Virus Protection',
'Installed Office',
'Partitions 4K Aligned',
),
},
'Custom': {}, # Will remain empty at runtime
}
if __name__ == '__main__':
try:
wk.setup.win.run_auto_setup(BASE_MENUS, PRESETS)
except KeyboardInterrupt:
wk.ui.cli.abort()
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()

14
scripts/build-ufd Executable file
View file

@ -0,0 +1,14 @@
#!/usr/bin/env python3
"""WizardKit: Build UFD Tool"""
# vim: sts=2 sw=2 ts=2
import wk
if __name__ == '__main__':
try:
wk.kit.ufd.build_ufd()
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()

View file

@ -0,0 +1,15 @@
"""WizardKit: Build Kit (Windows)."""
# vim: sts=2 sw=2 ts=2
import wk
if __name__ == '__main__':
try:
wk.kit.build.build_kit()
except KeyboardInterrupt:
wk.ui.cli.abort()
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()

13
scripts/check_av.ps1 Normal file
View file

@ -0,0 +1,13 @@
# WizardKit: Check Antivirus
#Requires -Version 3.0
if (Test-Path Env:\DEBUG) {
Set-PSDebug -Trace 1
}
$Host.UI.RawUI.WindowTitle = "WizardKit: Check Antivirus"
$Host.UI.RawUI.BackgroundColor = "black"
$Host.UI.RawUI.ForegroundColor = "white"
$ProgressPreference = "SilentlyContinue"
# Main
Get-CimInstance -Namespace "root\SecurityCenter2" -ClassName AntivirusProduct | select displayName,productState | ConvertTo-Json

View file

@ -0,0 +1,13 @@
# WizardKit: Check Partition Alignment
#Requires -Version 3.0
if (Test-Path Env:\DEBUG) {
Set-PSDebug -Trace 1
}
$Host.UI.RawUI.WindowTitle = "WizardKit: Check Partition Alignment"
$Host.UI.RawUI.BackgroundColor = "black"
$Host.UI.RawUI.ForegroundColor = "white"
$ProgressPreference = "SilentlyContinue"
# Main
Get-CimInstance -Query "Select * from Win32_DiskPartition" | select Name,Size,StartingOffset | ConvertTo-Json

29
scripts/ddrescue-tui Executable file
View file

@ -0,0 +1,29 @@
#!/bin/bash
#
## WizardKit: ddrescue TUI Launcher
__OS_NAME="$(uname -s)"
if [[ "$__OS_NAME" == "Darwin" ]]; then
__OS_NAME="macOS"
fi
__NOTICE="This script is not fully supported under $__OS_NAME!
Limitations:
Map files are saved to a RAM disk so you can't resume after a restart.
Only whole devices are supported.
Press Enter to continue..."
# Check if running under Linux
if [[ "$__OS_NAME" != "Linux" ]]; then
echo "${__NOTICE}"
read -r _dontcare
fi
source launch-in-tmux
SESSION_NAME="ddrescue-tui"
WINDOW_NAME="ddrescue TUI"
TMUX_CMD="ddrescue-tui.py"
launch_in_tmux "$@"

14
scripts/ddrescue-tui.py Executable file
View file

@ -0,0 +1,14 @@
#!/usr/bin/env python3
"""WizardKit: ddrescue TUI"""
# vim: sts=2 sw=2 ts=2
import wk
if __name__ == '__main__':
try:
wk.clone.ddrescue.main()
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()

View file

@ -0,0 +1,13 @@
# WizardKit: Disable Password Expiration (Local Accounts)
#Requires -Version 3.0
if (Test-Path Env:\DEBUG) {
Set-PSDebug -Trace 1
}
$Host.UI.RawUI.WindowTitle = "Disable Password Expiration"
$Host.UI.RawUI.BackgroundColor = "black"
$Host.UI.RawUI.ForegroundColor = "white"
$ProgressPreference = "SilentlyContinue"
# Main
Get-LocalUser | Set-LocalUser -PasswordNeverExpires $true

12
scripts/echo-and-hold Executable file
View file

@ -0,0 +1,12 @@
#!/bin/bash
#
## WizardKit: "echo" text to screen and "hold" by waiting for user input
function usage {
echo "Usage: $(basename "$0") \"text\""
echo " e.g. $(basename "$0") \"Some text to show\""
}
echo -en "$@" && read -r __dont_care
exit 0

View file

@ -0,0 +1,24 @@
"""WizardKit: Embedded Python helper.
This saves the keystrokes needed to fix the path and import wk. To use:
python.exe -i embedded_python_env.py
"""
# vim: sts=2 sw=2 ts=2
import pickle
import wk
# Functions
def load_state():
with open('debug/state.pickle', 'rb') as f:
return pickle.load(f)
# Main
wk.ui.cli.print_colored(
(wk.cfg.main.KIT_NAME_FULL, ': ', 'Debug Console'),
('GREEN', None, 'YELLOW'),
sep='',
)
print('')

View file

@ -0,0 +1,6 @@
"""WizardKit: Export Bitlocker Tool"""
# vim: sts=2 sw=2 ts=2
import wk
wk.os.win.export_bitlocker_info()

View file

@ -0,0 +1,3 @@
# WizardKit: Get RAW disks
Get-Disk | Where-Object {$_.PartitionStyle -eq "RAW"} | Select FriendlyName,Size,PartitionStyle | ConvertTo-JSON

11
scripts/hw-diags Executable file
View file

@ -0,0 +1,11 @@
#!/bin/bash
#
## WizardKit: HW Diagnostics Launcher
source launch-in-tmux
SESSION_NAME="hw-diags"
WINDOW_NAME="Hardware Diagnostics"
TMUX_CMD="hw-diags.py"
launch_in_tmux "$@"

14
scripts/hw-diags.py Executable file
View file

@ -0,0 +1,14 @@
#!/usr/bin/env python3
"""WizardKit: Hardware Diagnostics"""
# vim: sts=2 sw=2 ts=2
import wk
if __name__ == '__main__':
try:
wk.hw.diags.main()
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()

49
scripts/hw-drive-info Executable file
View file

@ -0,0 +1,49 @@
#!/bin/bash
#
BLUE='\033[34m'
CLEAR='\033[0m'
IFS=$'\n'
# Check if running under Linux
os_name="$(uname -s)"
if [[ "$os_name" == "Darwin" ]]; then
os_name="macOS"
fi
if [[ "$os_name" != "Linux" ]]; then
echo "This script is not supported under $os_name." 1>&2
exit 1
fi
# List devices
for line in $(lsblk -do NAME,TRAN,SIZE,VENDOR,MODEL,SERIAL); do
if [[ "${line:0:4}" == "NAME" ]]; then
echo -e "${BLUE}${line}${CLEAR}"
else
echo "${line}"
fi
done
echo ""
# List loopback devices
if [[ "$(losetup -l | wc -l)" > 0 ]]; then
for line in $(losetup -lO NAME,PARTSCAN,RO,BACK-FILE); do
if [[ "${line:0:4}" == "NAME" ]]; then
echo -e "${BLUE}${line}${CLEAR}"
else
echo "${line}" | sed -r 's#/dev/(loop[0-9]+)#\1 #'
fi
done
echo ""
fi
# List partitions
for line in $(lsblk -o NAME,SIZE,FSTYPE,LABEL,MOUNTPOINT); do
if [[ "${line:0:4}" == "NAME" ]]; then
echo -e "${BLUE}${line}${CLEAR}"
else
echo "${line}"
fi
done
echo ""

117
scripts/hw-info Executable file
View file

@ -0,0 +1,117 @@
#!/bin/bash
#
# COLORS
CLEAR="\e[0m"
RED="\e[31m"
GREEN="\e[32m"
YELLOW="\e[33m"
BLUE="\e[34m"
function print_in_columns() {
string="$1"
label="$(echo "$string" | sed -r 's/^\s*(.*:).*/\1/')"
value="$(echo "$string" | sed -r 's/^\s*.*:\s*(.*)/\1/')"
printf ' %-18s%s\n' "$label" "$value"
}
function print_dmi_value() {
name="$1"
file="/sys/devices/virtual/dmi/id/$2"
value="UNKNOWN"
if [[ -e "$file" ]]; then
value="$(cat "$file")"
fi
print_in_columns "$name: $value"
}
# Check if running under Linux
os_name="$(uname -s)"
if [[ "$os_name" == "Darwin" ]]; then
os_name="macOS"
fi
if [[ "$os_name" != "Linux" ]]; then
echo "This script is not supported under $os_name." 1>&2
exit 1
fi
# System
echo -e "${BLUE}System Information${CLEAR}"
print_dmi_value "Vendor" "sys_vendor"
print_dmi_value "Name" "product_name"
print_dmi_value "Serial" "product_serial"
echo ""
# Motherboard
echo -e "${BLUE}Motherboard${CLEAR}"
print_dmi_value "Vendor" "board_vendor"
print_dmi_value "Name" "board_name"
print_dmi_value "Version" "board_version"
print_dmi_value "Serial" "board_serial"
echo ""
# BIOS
echo -e "${BLUE}BIOS${CLEAR}"
print_dmi_value "Vendor" "bios_vendor"
print_dmi_value "Version" "bios_version"
print_dmi_value "Release Date" "bios_date"
echo ""
# Processor
echo -e "${BLUE}Processor${CLEAR}"
lscpu | grep -E '^(Arch|CPU.s.|Core|Thread|Model name|Virt)' \
| sed -r 's/\(s\)(.*:)/s\1 /' \
| sed -r 's/CPUs: /Threads:/' \
| sed -r 's/^(.*:) / \1/'
echo ""
# Memory
echo -e "${BLUE}Memory${CLEAR}"
first_device="True"
while read -r line; do
if [[ "$line" == "Memory Device" ]]; then
if [[ "$first_device" == "True" ]]; then
first_device="False"
else
# Add space between devices
echo ""
fi
else
print_in_columns "$line"
fi
done <<< $(sudo dmidecode -t memory \
| grep -E '^(Memory Device|\s+(Type|Size|Speed|Manuf.*|Locator|Part Number):)')
echo ""
# Graphics
echo -e "${BLUE}Graphics${CLEAR}"
lspci | grep 'VGA' | sed -r 's/^.*:/ Device: /' \
| sed 's/Intel Corporation/Intel/' \
| sed 's/Generation Core Processor Family/Gen/' \
| sed 's/Integrated Graphics Controller.*/iGPU/'
glxinfo 2>/dev/null | grep 'OpenGL renderer' | sed -r 's/^.*:/ OpenGL Renderer: /' \
| sed 's/Mesa DRI //'
echo ""
# Audio
echo -e "${BLUE}Audio${CLEAR}"
while read -r line; do
if [[ "$line" = .*no.soundcards.found.* ]]; then
echo " No soundcards found"
else
print_in_columns "$line"
fi
done <<< $(aplay -l 2>&1 | grep -Ei '(^card|no soundcards found)' | sed -r 's/.*\[(.*)\].*\[(.*)\].*/\1: \2/')
echo ""
# Network
echo -e "${BLUE}Network${CLEAR}"
lspci | grep -Ei '(ethernet|network|wireless|wifi)' \
| sed -r 's/.*: (.*)$/ \1/'
echo ""
# Drives
echo -e "${BLUE}Drives${CLEAR}"
hw-drive-info | sed 's/^/ /'
echo ""

46
scripts/hw-sensors Executable file
View file

@ -0,0 +1,46 @@
#!/usr/bin/env python3
"""WizardKit: Hardware Sensors"""
# vim: sts=2 sw=2 ts=2
import platform
import wk
def main() -> None:
"""Show sensor data on screen."""
sensors = wk.hw.sensors.Sensors()
if platform.system() == 'Darwin':
wk.ui.cli.clear_screen()
while True:
print('\033[100A', end='')
sensors.update_sensor_data()
wk.ui.cli.print_report(sensors.generate_report('Current', 'Max'))
wk.std.sleep(1)
elif platform.system() == 'Linux':
proc = wk.exe.run_program(cmd=['mktemp'])
sensors.start_background_monitor(
out_path=proc.stdout.strip(),
exit_on_thermal_limit=False,
temp_labels=('Current', 'Max'),
)
watch_cmd = [
'watch',
'--color',
'--exec',
'--no-title',
'--interval', '1',
'cat',
proc.stdout.strip(),
]
wk.exe.run_program(watch_cmd, check=False, pipe=False)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
pass
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()

View file

@ -0,0 +1,80 @@
:: WizardKit: Create client_dir folder(s)
@echo off
if defined DEBUG (@echo on)
:SafetyCheck
if not defined bin (goto Abort)
:GetDate
:: Credit to SS64.com Code taken from http://ss64.com/nt/syntax-getdate.html
:: Use WMIC to retrieve date and time in ISO 8601 format.
for /f "skip=1 tokens=1-6" %%G in ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') do (
if "%%~L"=="" goto s_done
set _yyyy=%%L
set _mm=00%%J
set _dd=00%%G
set _hour=00%%H
set _minute=00%%I
)
:s_done
:: Pad digits with leading zeros
set _mm=%_mm:~-2%
set _dd=%_dd:~-2%
set _hour=%_hour:~-2%
set _minute=%_minute:~-2%
set iso_date=%_yyyy%-%_mm%-%_dd%
:SetVars
set "SETTINGS=%bin%\Scripts\wk\cfg\main.py"
for /f "tokens=* usebackq" %%f in (`findstr KIT_NAME_SHORT "%SETTINGS%"`) do (
set "_v=%%f"
set "_v=!_v:*'=!"
set "KIT_NAME_SHORT=!_v:~0,-1!"
)
set "client_dir=%systemdrive%\%KIT_NAME_SHORT%"
set "log_dir=%client_dir%\Logs\%iso_date%"
:Flags
set _backups=
set _info=
set _office=
set _quarantine=
set _quickbooks=
set _transfer=
for %%f in (%*) do (
if /i "%%f" == "/DEBUG" (@echo on)
if /i "%%f" == "/Backups" set _backups=True
if /i "%%f" == "/Logs" set _logs=True
if /i "%%f" == "/Office" set _office=True
if /i "%%f" == "/Quarantine" set _quarantine=True
if /i "%%f" == "/QuickBooks" set _quickbooks=True
if /i "%%f" == "/Transfer" set _transfer=True
)
:CreateDirs
if defined _backups mkdir "%client_dir%\Backups">nul 2>&1
if defined _logs (
mkdir "%log_dir%\%KIT_NAME_FULL%">nul 2>&1
mkdir "%log_dir%\Tools">nul 2>&1)
if defined _office mkdir "%client_dir%\Office">nul 2>&1
if defined _quarantine mkdir "%client_dir%\Quarantine">nul 2>&1
if defined _quickbooks mkdir "%client_dir%\QuickBooks">nul 2>&1
if defined _transfer mkdir "%client_dir%\Transfer_%iso_date%">nul 2>&1
goto Done
:Abort
color 4e
echo Aborted.
echo.
echo Press any key to exit...
pause>nul
color
rem Set errorlevel to 1 by calling color incorrectly
color 00
goto Exit
:Done
goto Exit
:Exit

View file

@ -0,0 +1,37 @@
# WizardKit: Install winget (if needed)
#Requires -Version 3.0
if (Test-Path Env:\DEBUG) {
Set-PSDebug -Trace 1
}
$Host.UI.RawUI.WindowTitle = "WizardKit: Winget installer"
$Host.UI.RawUI.BackgroundColor = "black"
$Host.UI.RawUI.ForegroundColor = "white"
$ProgressPreference = "SilentlyContinue"
# STATIC VARIABLES
$EXIT_OK = 0
$EXIT_INSTALLED = 1
$EXIT_FAILED_TO_INSTALL = 2
# Main
$NeedsInstalled = $false
try {
$_ = $(winget --version)
}
catch {
$NeedsInstalled = $true
}
# Install
if (! $NeedsInstalled) {
exit $EXIT_INSTALLED
}
try {
Add-AppxPackage -ErrorAction Stop -RegisterByFamilyName -MainPackage Microsoft.DesktopAppInstaller_8wekyb3d8bbwe
}
catch {
exit $EXIT_FAILED_TO_INSTALL
}
exit $EXIT_OK

View file

@ -0,0 +1,7 @@
#!/bin/bash
#
## Monitor journal log for data recovery related events
echo -e 'Monitoring journal output...\n'
journalctl -kf \
| grep -Ei --color=always 'ata|nvme|scsi|sd[a..z]+|usb|comreset|critical|error'

74
scripts/launch-in-tmux Executable file
View file

@ -0,0 +1,74 @@
#!/bin/bash
#
## WizardKit: TMUX Launcher
# Live macOS env workaround
tmux_args=()
if [[ -e "/.wk-live-macos" ]]; then
tmux_args=(-f "/etc/tmux.conf" -S "/Volumes/RAM_Disk/.tmux.socket")
fi
function ask() {
while :; do
read -p "$1 [Y/N] " -r answer
if echo "$answer" | grep -Eiq '^(y|yes|sure)$'; then
return 0
elif echo "$answer" | grep -Eiq '^(n|no|nope)$'; then
return 1
fi
done
}
function err () {
echo "$0:" "$@" >&2
return 1
}
function launch_in_tmux() {
# Check for required vars
[[ -n "${SESSION_NAME:-}" ]] || return $(err "Required variable missing (SESSION_NAME)")
[[ -n "${WINDOW_NAME:-}" ]] || return $(err "Required variable missing (WINDOW_NAME)")
[[ -n "${TMUX_CMD:-}" ]] || return $(err "Required variable missing (TMUX_CMD)")
# Check for running session
if tmux "${tmux_args[@]}" list-session 2>&1 | grep -q "$SESSION_NAME"; then
echo "WARNING: tmux session $SESSION_NAME already exists."
echo ""
if ask "Connect to current session?"; then
if [[ -n "${TMUX:-}" ]]; then
# Running inside TMUX, switch to session
tmux "${tmux_args[@]}" switch-client -t "$SESSION_NAME"
if ! jobs %% >/dev/null 2>&1; then
# No running jobs, try exiting abandoned tmux session
exit 0
fi
else
# Running outside TMUX, attach to session
tmux "${tmux_args[@]}" attach-session -t "$SESSION_NAME"
fi
return 0
elif ask "Kill current session and start new session?"; then
tmux "${tmux_args[@]}" kill-session -t "$SESSION_NAME" || \
die "Failed to kill session: $SESSION_NAME"
else
echo "Aborted."
return 1
fi
fi
# Start session
if [[ -n "${TMUX:-}" ]]; then
# Running inside TMUX, save current session/window names
ORIGINAL_SESSION_NAME="$(tmux "${tmux_args[@]}" display-message -p '#S')"
ORIGINAL_WINDOW_NAME="$(tmux "${tmux_args[@]}" display-message -p '#W')"
tmux "${tmux_args[@]}" rename-session "$SESSION_NAME"
tmux "${tmux_args[@]}" rename-window "$WINDOW_NAME"
"$TMUX_CMD" "$@"
# Restore previous session/window names
tmux "${tmux_args[@]}" rename-session "${ORIGINAL_SESSION_NAME}"
tmux "${tmux_args[@]}" rename-window "${ORIGINAL_WINDOW_NAME}"
else
# Running outside TMUX, start/attach to session
tmux "${tmux_args[@]}" new-session -s "$SESSION_NAME" -n "$WINDOW_NAME" "$TMUX_CMD" "$@"
fi
}

99
scripts/launch_sdio.py Normal file
View file

@ -0,0 +1,99 @@
"""WizardKit: Launch Snappy Driver Installer Origin"""
# vim: sts=2 sw=2 ts=2
from subprocess import CompletedProcess
import wk
from wk.cfg.net import SDIO_SERVER
# STATIC VARIABLES
MOUNT_EXCEPTIONS = (
RuntimeError,
wk.exe.subprocess.CalledProcessError,
)
SDIO_LOCAL_PATH = wk.kit.tools.get_tool_path("SDIO", "SDIO")
SDIO_REMOTE_PATH = wk.io.get_path_obj(
(
fr'\\{SDIO_SERVER["Address"]}\{SDIO_SERVER["Share"]}\{SDIO_SERVER["Path"]}'
fr'\SDIO{"64" if wk.os.win.ARCH == "64" else ""}.exe'
),
resolve=False,
)
# Functions
def try_again() -> bool:
"""Ask to try again or quit."""
if wk.ui.cli.ask(' Try again?'):
return True
if not wk.ui.cli.ask(' Use local version?'):
wk.ui.cli.abort()
return False
def use_network_sdio() -> bool:
"""Try to mount SDIO server."""
use_network = False
def _mount_server() -> CompletedProcess:
print('Connecting to server... (Press CTRL+c to use local copy)')
return wk.net.mount_network_share(SDIO_SERVER, read_write=False)
# Bail early
if not SDIO_SERVER['Address']:
return use_network
# Main loop
while True:
try:
proc = _mount_server()
except KeyboardInterrupt:
break
except MOUNT_EXCEPTIONS as err:
wk.ui.cli.print_error(f' {err}')
if not try_again():
break
else:
if proc.returncode == 0:
# Network copy available
use_network = True
break
# Failed to mount
wk.ui.cli.print_error(' Failed to mount server')
if not try_again():
break
# Done
return use_network
if __name__ == '__main__':
wk.ui.cli.set_title(
f'{wk.cfg.main.KIT_NAME_FULL}: Snappy Driver Installer Origin Launcher',
)
log_dir = wk.log.format_log_path(tool=True).parent
USE_NETWORK = False
# Windows 11 workaround
if wk.os.win.OS_VERSION == 11:
appid_services = ['appid', 'appidsvc', 'applockerfltr']
for svc in appid_services:
wk.os.win.stop_service(svc)
if any([wk.os.win.get_service_status(s) != 'stopped' for s in appid_services]):
raise wk.std.GenericWarning('Failed to stop AppID services')
# Try to mount server
try:
USE_NETWORK = use_network_sdio()
except KeyboardInterrupt:
wk.ui.cli.abort()
# Run SDIO
EXE_PATH = SDIO_LOCAL_PATH
if USE_NETWORK:
EXE_PATH = SDIO_REMOTE_PATH
print('Using network copy!')
else:
print('Using local copy!')
cmd = [EXE_PATH, '-log_dir', log_dir]
wk.exe.run_program(cmd, check=False, cwd=EXE_PATH.parent)

67
scripts/max-cpu-temp Executable file
View file

@ -0,0 +1,67 @@
#!/bin/env python3
#
import json
import re
import subprocess
from typing import Any
CPU_REGEX = re.compile(r'(core|k\d+)temp', re.IGNORECASE)
NON_TEMP_REGEX = re.compile(r'^(fan|in|curr)', re.IGNORECASE)
def get_data() -> dict[Any, Any]:
cmd = ('sensors', '-j')
data = {}
raw_data = []
try:
proc = subprocess.run(
args=cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
encoding='utf-8',
check=True,
)
except subprocess.CalledProcessError:
return data
for line in proc.stdout.splitlines():
if line.strip() == ',':
# Assuming malformatted line caused by missing data
continue
raw_data.append(line)
try:
data = json.loads('\n'.join(raw_data))
except json.JSONDecodeError:
# Still broken, just return the empty dict
pass
return data
def get_max_temp(data) -> str:
cpu_temps = []
max_cpu_temp = '??° C'
for adapter, sources in data.items():
if not CPU_REGEX.search(adapter):
continue
sources.pop('Adapter', None)
for labels in sources.values():
for label, temp in sorted(labels.items()):
if 'input' not in label or NON_TEMP_REGEX.search(label):
continue
cpu_temps.append(temp)
# Format data
if cpu_temps:
max_cpu_temp = int(max(cpu_temps))
max_cpu_temp = f'{max_cpu_temp:02d}° C'
# Done
return max_cpu_temp
if __name__ == '__main__':
sensor_data = get_data()
print(get_max_temp(sensor_data))

41
scripts/mount-all-volumes Executable file
View file

@ -0,0 +1,41 @@
#!/usr/bin/env python3
"""WizardKit: Mount all volumes"""
# vim: sts=2 sw=2 ts=2
import sys
import wk
# Functions
def main() -> None:
"""Mount all volumes and show results."""
wk.ui.cli.print_standard(f'{wk.cfg.main.KIT_NAME_FULL}: Volume mount tool')
wk.ui.cli.print_standard(' ')
# Mount volumes and get report
wk.ui.cli.print_standard('Mounting volumes...')
wk.os.linux.mount_volumes()
report = wk.os.linux.build_volume_report()
# Show results
wk.ui.cli.print_info('Results')
wk.ui.cli.print_report(report)
# GUI mode
if 'gui' in sys.argv:
wk.ui.cli.pause('Press Enter to exit...')
wk.exe.popen_program(['nohup', 'thunar', '/media'])
if __name__ == '__main__':
if wk.std.PLATFORM != 'Linux':
os_name = wk.std.PLATFORM.replace('Darwin', 'macOS')
wk.ui.cli.print_error(f'This script is not supported under {os_name}.')
wk.ui.cli.abort()
try:
main()
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()

29
scripts/mount-backup-shares Executable file
View file

@ -0,0 +1,29 @@
#!/usr/bin/env python3
"""WizardKit: Mount Backup Shares"""
# vim: sts=2 sw=2 ts=2
import wk
# Functions
def main() -> None:
"""Attempt to mount backup shares and print report."""
wk.ui.cli.print_info('Mounting Backup Shares')
report = wk.net.mount_backup_shares()
for line in report:
color = 'GREEN'
line = f' {line}'
if 'Failed' in line:
color = 'RED'
elif 'Already' in line:
color = 'YELLOW'
print(wk.ansi.color_string(line, color))
if __name__ == '__main__':
try:
main()
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()

32
scripts/mount-raw-image Executable file
View file

@ -0,0 +1,32 @@
#!/bin/bash
#
## WizardKit: RAW image mounting tool
set -o errexit
set -o errtrace
set -o nounset
set -o pipefail
LOOPDEV="$(losetup -f)"
function usage {
echo "Usage: $(basename "$0") [image]"
echo " e.g. $(basename "$0") HDD.dd"
}
if [[ -f "${1:-}" ]]; then
sudo losetup -P "${LOOPDEV}" "${1:-}"
sleep 1
if [[ -b "${LOOPDEV}p1" ]]; then
# losetup detected partitions
for dev in "${LOOPDEV}p"*; do
udevil mount -o ro "${dev}" || true
done
else
# losetup did not detect partitions, attempt whole image
udevil mount -o ro "${LOOPDEV}" || true
fi
else
usage
exit 1
fi

79
scripts/msword-search Executable file
View file

@ -0,0 +1,79 @@
#!/bin/python3
#
## WizardKit: MS Word content search tool
import os
import re
import sys
import wk
# STATIC VARIABLES
SCANDIR = os.getcwd()
USAGE = '''Usage: {script} <search-terms>...
e.g. {script} "Book Title" "Keyword" "etc"
This script will search all doc/docx files below the current directory for
the search-terms provided (case-insensitive).'''.format(script=__file__)
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 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:
if entry.name.lower().endswith('.docx'):
result = wk.exe.run_program(['unzip', '-p', entry.path])
else:
# Assuming .doc
result = wk.exe.run_program(['antiword', entry.path])
out = result.stdout.decode()
match = re.search(search, out, re.IGNORECASE)
except Exception:
# Ignore errors since files may be corrupted
pass
return entry.path if match else None
if __name__ == '__main__':
try:
# Prep
wk.ui.cli.clear_screen()
terms = [re.sub(r'\s+', r'\s*', t) for t in sys.argv[1:]]
search = '({})'.format('|'.join(terms))
if len(sys.argv) == 1:
# Print usage
wk.ui.cli.print_standard(USAGE)
else:
matches = []
for entry in scan_for_docs(SCANDIR):
matches.append(scan_file(entry.path, search))
# Strip None values (i.e. non-matching entries)
matches = [m for m in matches if m]
if matches:
wk.ui.cli.print_success('Found {} {}:'.format(
len(matches),
'Matches' if len(matches) > 1 else 'Match'))
for match in matches:
wk.ui.cli.print_standard(match)
else:
wk.ui.cli.print_error('No matches found.')
# Done
wk.ui.cli.print_standard('\nDone.')
#pause("Press Enter to exit...")
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()
# vim: sts=2 sw=2 ts=2

10
scripts/numlock Executable file
View file

@ -0,0 +1,10 @@
#!/bin/env bash
#
## Enable numlock if no battery is detected
## Credit: https://wiki.archlinux.org/title/Activating_numlock_on_bootup#With_systemd_service
if ! compgen -G "/sys/class/power_supply/BAT*" >/dev/null; then
for tty in /dev/tty{1..6}; do
/usr/bin/setleds -D +num < "$tty"
done
fi

18
scripts/pacinit Executable file
View file

@ -0,0 +1,18 @@
#!/bin/bash
#
## WizardKit: Update pacman settings to usage in live sessions
# Disable custom repo (used at build-time)
sudo sed -i -r "s/^(\[custom\])/#\1/" /etc/pacman.conf
sudo sed -i -r "s/^(SigLevel = Optional TrustAll)/#\1/" /etc/pacman.conf
sudo sed -i -r "s/^(Server = )/#\1/" /etc/pacman.conf
# Disable signature checks
sudo sed -i -r "s/^SigLevel.*/SigLevel = Never/" /etc/pacman.conf
# Init Pacman keyring
sudo systemctl start pacman-init.service
# Refresh package databases and install packages (if provided)
sudo pacman -Sy "$@"

19
scripts/pyproject.toml Normal file
View file

@ -0,0 +1,19 @@
[tool.ruff.per-file-ignores]
# Init files
"wk/__init__.py" = ["F401"]
"wk/cfg/__init__.py" = ["F401"]
"wk/clone/__init__.py" = ["F401"]
"wk/hw/__init__.py" = ["F401"]
"wk/kit/__init__.py" = ["F401"]
"wk/os/__init__.py" = ["F401"]
"wk/repairs/__init__.py" = ["F401"]
"wk/setup/__init__.py" = ["F401"]
"wk/ui/__init__.py" = ["F401"]
# Long lines
"wk/borrowed/acpi.py" = ["E501", "F841"]
"wk/cfg/ddrescue.py" = ["E501"]
"wk/cfg/hw.py" = ["E501"]
"wk/cfg/launchers.py" = ["E501"]
"wk/cfg/setup.py" = ["E501"]
"wk/cfg/sources.py" = ["E501"]

21
scripts/remount-rw Executable file
View file

@ -0,0 +1,21 @@
#!/bin/bash
#
## WizardKit: Volume remount tool
if ! mount | grep -q "$1"; then
echo "ERROR: Can't remount $1"
sleep 2s
exit 1
fi
DEVICE=$(mount | grep "$1" | cut -d' ' -f1)
# Remount read-write
echo "Remounting: $DEVICE"
udevil umount $DEVICE
if udevil mount $DEVICE; then
echo "Done"
else
echo "Failed"
fi
exit 0

33
scripts/resize-and-run Executable file
View file

@ -0,0 +1,33 @@
#!/bin/bash
#
# Magic numbers:
## Width: | 20 | term_x | 20 | 180 (conky) | 20 |
## Height: | 24 | 10 (titlebar) | term_y | 24 | 30 (Tint2) |
## X Offset: 20 - 5 (shadow?)
## Y Offset: 24 - 5 (shadow?)
conky_width=180
gap_x=20
gap_y=24
picom_shadow=5
tint2_height=30
titlebar_height=10
source ~/.screen_data
if [[ "${dpi}" -ge 192 ]]; then
conky_width=360
gap_x=40
gap_y=48
picom_shadow=5
tint2_height=60
titlebar_height=20
fi
offset_x=$(echo "$gap_x - $picom_shadow" | bc)
offset_y=$(echo "$gap_y - $picom_shadow" | bc)
term_width="$(echo "$width_px - ($gap_x * 3) - $conky_width" | bc)"
term_height="$(echo "$height_px - ($gap_y * 2) - $titlebar_height - $tint2_height" | bc)"
sleep 0.1s
wmctrl -r :ACTIVE: -e "0,$offset_x,$offset_y,$term_width,$term_height" && "$@"

4
scripts/start-max Executable file
View file

@ -0,0 +1,4 @@
#!/bin/bash
#
wmctrl -r:ACTIVE: -b toggle,maximized_vert,maximized_horz && "$@"

27
scripts/unmount-backup-shares Executable file
View file

@ -0,0 +1,27 @@
#!/usr/bin/env python3
"""WizardKit: Unmount Backup Shares"""
# vim: sts=2 sw=2 ts=2
import wk
# Functions
def main() -> None:
"""Attempt to mount backup shares and print report."""
wk.ui.cli.print_info('Unmounting Backup Shares')
report = wk.net.unmount_backup_shares()
for line in report:
color = 'GREEN'
line = f' {line}'
if 'Not mounted' in line:
color = 'YELLOW'
print(wk.ui.ansi.color_string(line, color))
if __name__ == '__main__':
try:
main()
except SystemExit:
raise
except: # noqa: E722
wk.ui.cli.major_exception()

89
scripts/upload-logs Executable file
View file

@ -0,0 +1,89 @@
#!/usr/bin/env python3
# vim: sts=2 sw=2 ts=2
"""WizardKit: Upload Logs"""
import datetime
import os
import pathlib
import pytz
import requests
import wk
# STATIC VARIABLES
LOG_DIR = pathlib.Path('~/Logs').expanduser().resolve()
PLATFORM = wk.std.PLATFORM.replace('Darwin', 'macOS')
TIMEZONE = pytz.timezone(wk.cfg.main.LINUX_TIME_ZONE)
NOW = datetime.datetime.now(tz=TIMEZONE)
# Safety check
if PLATFORM not in ('macOS', 'Linux'):
raise OSError(f'This script is not supported under {PLATFORM}')
# Functions
def main() -> None:
"""Upload logs for review."""
lines = []
try_and_print = wk.ui.cli.TryAndPrint()
# Set log
wk.log.update_log_path(dest_name='Upload-Logs', timestamp=True)
# Instructions
wk.ui.cli.print_success(f'{wk.cfg.main.KIT_NAME_FULL}: Upload Logs')
wk.ui.cli.print_standard('')
wk.ui.cli.print_standard('Please state the reason for the review.')
wk.ui.cli.print_info(' End note with an empty line.')
wk.ui.cli.print_standard('')
# Get reason note
while True:
text = wk.ui.cli.input_text('> ')
if not text:
lines.append('')
break
lines.append(text)
with open(f'{LOG_DIR}/__reason__.txt', 'a') as _f:
_f.write('\n'.join(lines))
# Compress and upload logs
result = try_and_print.run(
message='Uploading logs...',
function=upload_log_dir,
reason='Review',
)
if not result['Failed']:
raise SystemExit(1)
def upload_log_dir(reason='Testing') -> None:
"""Upload compressed log_dir to the crash server."""
server = wk.cfg.net.CRASH_SERVER
dest = pathlib.Path(f'~/{reason}_{NOW.strftime("%Y-%m-%dT%H%M%S%z")}.txz')
dest = dest.expanduser().resolve()
# Compress LOG_DIR (relative to parent dir)
os.chdir(LOG_DIR.parent)
cmd = ['tar', 'caf', dest.name, LOG_DIR.name]
wk.exe.run_program(cmd, check=False)
# Upload compressed data
url = f'{server["Url"]}/{dest.name}'
result = requests.put(
url,
data=dest.read_bytes(),
headers=server['Headers'],
auth=(server['User'], server['Pass']),
)
# Check result
if not result.ok:
raise wk.std.GenericError('Failed to upload logs')
if __name__ == '__main__':
main()

11
scripts/watch-mac Executable file
View file

@ -0,0 +1,11 @@
#!/bin/zsh
#
## watch-like utility
WATCH_FILE="${1}"
while :; do
echo -n "\e[100A"
cat "${WATCH_FILE}"
sleep 1s
done

5
scripts/wk-debug Executable file
View file

@ -0,0 +1,5 @@
#!/bin/bash
#
## WizardKit: Debug Launcher
python3 -i /usr/local/bin/wk_debug.py

52
scripts/wk-power-command Executable file
View file

@ -0,0 +1,52 @@
#!/bin/bash
#
## Wizard Kit: Wrapper for logout, reboot, & poweroff
set -o errexit
set -o errtrace
set -o nounset
set -o pipefail
# Functions
function linux_power_cmd() {
case "${1:-x}" in
poweroff)
sudo systemctl poweroff;;
reboot)
sudo systemctl reboot;;
*)
openbox --exit;;
esac
}
function macos_power_cmd() {
case "${1:-x}" in
poweroff)
shutdown -h now;;
reboot)
shutdown -r now;;
*)
exit;;
esac
}
# "Main"
if [[ -e "/.wk-live-macos" ]]; then
# Flush write cache
sync
# Perform requested action
macos_power_cmd "${1:-x}"
else
# Unmount filesystems
find /media -maxdepth 1 -mindepth 1 -type d \
-exec udevil umount "{}" \;
# Flush write cache
sudo sync
# Perform requested action
linux_power_cmd "${1:-x}"
fi
exit 0

39
scripts/wk/__init__.py Normal file
View file

@ -0,0 +1,39 @@
"""WizardKit: wk module init"""
# vim: sts=2 sw=2 ts=2
from sys import stderr, version_info
from . import cfg
from . import clone
from . import debug
from . import exe
from . import graph
from . import hw
from . import io
from . import kit
from . import log
from . import net
from . import os
from . import repairs
from . import setup
from . import std
from . import ui
# Check env
if version_info < (3, 10):
# Unsupported
raise RuntimeError(
'This package is unsupported on Python '
f'{version_info.major}.{version_info.minor}'
)
# Init
try:
log.start()
except UserWarning as err:
print(err, file=stderr)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -0,0 +1,57 @@
import sys
# Code borrowed from https://github.com/aeruder/get_win8key
if sys.platform.startswith('win32'):
import ctypes
import ctypes.wintypes
def EnumAcpiTables():
#returns a list of the names of the ACPI tables on this system
FirmwareTableProviderSignature=ctypes.wintypes.DWORD(1094930505)
pFirmwareTableBuffer=ctypes.create_string_buffer(0)
BufferSize=ctypes.wintypes.DWORD(0)
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms724259
EnumSystemFirmwareTables=ctypes.WinDLL("Kernel32").EnumSystemFirmwareTables
ret=EnumSystemFirmwareTables(FirmwareTableProviderSignature, pFirmwareTableBuffer, BufferSize)
pFirmwareTableBuffer=None
pFirmwareTableBuffer=ctypes.create_string_buffer(ret)
BufferSize.value=ret
ret2=EnumSystemFirmwareTables(FirmwareTableProviderSignature, pFirmwareTableBuffer, BufferSize)
return [pFirmwareTableBuffer.value[i:i+4] for i in range(0, len(pFirmwareTableBuffer.value), 4)]
def GetAcpiTable(table):
#returns raw contents of ACPI table
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms724379x
tableID = 0
for b in reversed(table):
tableID = (tableID << 8) + b
GetSystemFirmwareTable=ctypes.WinDLL("Kernel32").GetSystemFirmwareTable
FirmwareTableProviderSignature=ctypes.wintypes.DWORD(1094930505)
FirmwareTableID=ctypes.wintypes.DWORD(int(tableID))
pFirmwareTableBuffer=ctypes.create_string_buffer(0)
BufferSize=ctypes.wintypes.DWORD(0)
ret = GetSystemFirmwareTable(FirmwareTableProviderSignature, FirmwareTableID, pFirmwareTableBuffer, BufferSize)
pFirmwareTableBuffer=None
pFirmwareTableBuffer=ctypes.create_string_buffer(ret)
BufferSize.value=ret
ret2 = GetSystemFirmwareTable(FirmwareTableProviderSignature, FirmwareTableID, pFirmwareTableBuffer, BufferSize)
return pFirmwareTableBuffer.raw
elif sys.platform.startswith('linux'):
import os
TABLE_ROOT = b'/sys/firmware/acpi/tables'
def EnumAcpiTables():
return os.listdir(TABLE_ROOT)
def GetAcpiTable(table):
with open(os.path.join(TABLE_ROOT, table), 'rb') as o:
return o.read()
else:
raise NotImplementedError('acpi support only implemented for linux and win32')
def FindAcpiTable(table):
#checks if specific ACPI table exists and returns True/False
tables = EnumAcpiTables()
if table in tables:
return True
else:
return False

View file

@ -0,0 +1,14 @@
"""WizardKit: cfg module init"""
from . import ddrescue
from . import hw
from . import launchers
from . import log
from . import main
from . import music
from . import net
from . import repairs
from . import setup
from . import sources
from . import ufd
from . import windows_builds

View file

@ -0,0 +1,76 @@
"""WizardKit: Config - ddrescue"""
# vim: sts=2 sw=2 ts=2
# Layout
TMUX_SIDE_WIDTH = 21
TMUX_LAYOUT = {
'Source': {'height': 2, 'Check': True},
'Started': {'width': TMUX_SIDE_WIDTH, 'Check': True},
'Progress': {'width': TMUX_SIDE_WIDTH, 'Check': True},
}
# ddrescue
AUTO_PASS_THRESHOLDS = {
# NOTE: The scrape key is set to infinity to force a break
'read-skip': 50,
'read-full': 95,
'trim': 98,
'scrape': float('inf'),
}
DDRESCUE_MAP_TEMPLATE = '''# Mapfile. Created by {name}
0x0 ? 1
0x0 {size:#x} ?
'''
DDRESCUE_SETTINGS = {
'Default': {
'--binary-prefixes': {'Selected': True, 'Hidden': True, },
'--complete-only': {'Selected': True, 'Hidden': True, },
'--data-preview': {'Selected': True, 'Value': '5', 'Hidden': True, },
'--idirect': {'Selected': True, },
'--odirect': {'Selected': True, },
'--input-position': {'Selected': False, 'Value': '0', },
'--max-error-rate': {'Selected': True, 'Value': '100MiB', },
'--max-read-rate': {'Selected': False, 'Value': '1MiB', },
'--min-read-rate': {'Selected': True, 'Value': '64KiB', },
'--reopen-on-error': {'Selected': False, },
'--retry-passes': {'Selected': True, 'Value': '0', },
'--reverse': {'Selected': False, },
'--skip-size': {'Selected': True, 'Value': '0.001,0.02', }, # Percentages of source size
'--test-mode': {'Selected': False, },
'--timeout': {'Selected': True, 'Value': '30m', },
'-vvvv': {'Selected': True, 'Hidden': True, },
},
'Fast': {
'--max-error-rate': {'Selected': True, 'Value': '32MiB', },
'--min-read-rate': {'Selected': True, 'Value': '1MiB', },
'--timeout': {'Selected': True, 'Value': '5m', },
},
'Safe': {
'--max-read-rate': {'Selected': True, 'Value': '64MiB', },
'--min-read-rate': {'Selected': True, 'Value': '1KiB', },
'--timeout': {'Selected': False, 'Value': '30m', },
},
}
DDRESCUE_SPECIFIC_PASS_SETTINGS = {
'read-skip': ['--no-scrape', '--no-trim', '--cpass=1,2'],
'read-full': ['--no-scrape', '--no-trim'],
'trim': ['--no-scrape'],
}
DRIVE_POWEROFF_TIMEOUT = 90
PARTITION_TYPES = {
'GPT': {
'NTFS': 'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7', # Basic Data Partition
'VFAT': 'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7', # Basic Data Partition
'EXFAT': 'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7', # Basic Data Partition
},
'MBR': {
'EXFAT': '7',
'NTFS': '7',
'VFAT': 'b',
},
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

173
scripts/wk/cfg/hw.py Normal file
View file

@ -0,0 +1,173 @@
"""WizardKit: Config - Hardware"""
# vim: sts=2 sw=2 ts=2
import re
# STATIC VARIABLES
ATTRIBUTE_COLORS = (
# NOTE: Ordered by ascending importance
('Warning', 'YELLOW'),
('Error', 'RED'),
('Maximum', 'PURPLE'),
)
# NOTE: Force 4K read block size for disks >= 3TB
BADBLOCKS_EXTRA_LARGE_DISK = 15 * 1024**4
BADBLOCKS_LARGE_DISK = 3 * 1024**4
BADBLOCKS_REGEX = re.compile(
r'^Pass completed, (\d+) bad blocks found. .(\d+)/(\d+)/(\d+) errors',
re.IGNORECASE,
)
BADBLOCKS_RESULTS_REGEX = re.compile(r'^(.*?)\x08.*\x08(.*)')
BADBLOCKS_SKIP_REGEX = re.compile(r'^(Checking|\[)', re.IGNORECASE)
CPU_TEMPS = {
'Cooling Delta': 25,
'Cooling Low Cutoff': 50,
'Critical': 100,
'Idle Delta': 25,
'Idle High': 70,
}
CPU_TEST_MINUTES = 7
IO_GRAPH_WIDTH = 40
IO_ALT_TEST_SIZE_FACTOR = 0.01
IO_BLOCK_SIZE = 512 * 1024
IO_CHUNK_SIZE = 32 * 1024**2
IO_MINIMUM_TEST_SIZE = 10 * 1024**3
IO_RATE_REGEX = re.compile(
r'(?P<bytes>\d+) bytes.* (?P<seconds>\S+) s(?:,|ecs )',
)
KEY_NVME = 'nvme_smart_health_information_log'
KEY_SMART = 'ata_smart_attributes'
KNOWN_DISK_ATTRIBUTES = {
# NVMe
'critical_warning': {'Blocking': True, 'Warning': None, 'Error': 1, 'Maximum': None, },
'media_errors': {'Blocking': False, 'Warning': None, 'Error': 1, 'Maximum': None, },
'power_on_hours': {'Blocking': False, 'Warning': 17532, 'Error': 26298, 'Maximum': 100000,},
'unsafe_shutdowns': {'Blocking': False, 'Warning': 1, 'Error': None, 'Maximum': None, },
# SMART
5: {'Hex': '05', 'Blocking': True, 'Warning': None, 'Error': 1, 'Maximum': None, },
9: {'Hex': '09', 'Blocking': False, 'Warning': 17532, 'Error': 26298, 'Maximum': 100000,},
10: {'Hex': '10', 'Blocking': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, },
184: {'Hex': 'B8', 'Blocking': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, },
187: {'Hex': 'BB', 'Blocking': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, },
188: {'Hex': 'BC', 'Blocking': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, },
196: {'Hex': 'C4', 'Blocking': False, 'Warning': 1, 'Error': 10, 'Maximum': 10000, },
197: {'Hex': 'C5', 'Blocking': True, 'Warning': None, 'Error': 1, 'Maximum': None, },
198: {'Hex': 'C6', 'Blocking': True, 'Warning': None, 'Error': 1, 'Maximum': None, },
199: {'Hex': 'C7', 'Blocking': False, 'Warning': None, 'Error': 1, 'Maximum': None, },
201: {'Hex': 'C9', 'Blocking': False, 'Warning': None, 'Error': 1, 'Maximum': 10000, },
}
KNOWN_DISK_MODELS = {
# model_regex: model_attributes
r'CT(250|500|1000|2000)MX500SSD(1|4)': {
197: {'Warning': 1, 'Error': 2, 'Note': '(MX500 thresholds)',},
},
r'MZ(7|N)LN(128|256|512|1T0)HA(HQ|JQ|LR)-000H(1|7)': {
# Source: https://www.smartmontools.org/ticket/920
201: {'Error': 99, 'PercentageLife': True, 'Note': '(PM871b thresholds)'},
},
}
KNOWN_RAM_VENDOR_IDS = {
# https://github.com/hewigovens/hewigovens.github.com/wiki/Memory-vendor-code
'0x014F': 'Transcend',
'0x2C00': 'Micron',
'0x802C': 'Micron',
'0x80AD': 'Hynix',
'0x80CE': 'Samsung',
'0xAD00': 'Hynix',
'0xCE00': 'Samsung',
}
NVME_WARNING_KEYS = (
'spare_below_threshold',
'reliability_degraded',
'volatile_memory_backup_failed',
)
REGEX_POWER_ON_TIME = re.compile(
r'^(\d+)([Hh].*|\s+\(\d+\s+\d+\s+\d+\).*)'
)
SMART_SELF_TEST_START_TIMEOUT_IN_SECONDS = 120
SMC_IDS = {
# Sources: https://github.com/beltex/SMCKit/blob/master/SMCKit/SMC.swift
# http://www.opensource.apple.com/source/net_snmp/
# https://github.com/jedda/OSX-Monitoring-Tools
'TA0P': {'CPU Temp': False, 'Source': 'Ambient'},
'TA0S': {'CPU Temp': False, 'Source': 'PCIE Slot 1 Ambient'},
'TA1P': {'CPU Temp': False, 'Source': 'Ambient'},
'TA1S': {'CPU Temp': False, 'Source': 'PCIE Slot 1 PCB'},
'TA2S': {'CPU Temp': False, 'Source': 'PCIE Slot 2 Ambient'},
'TA3S': {'CPU Temp': False, 'Source': 'PCIE Slot 2 PCB'},
'TC0C': {'CPU Temp': True, 'Source': 'CPU Core 1'},
'TC0D': {'CPU Temp': True, 'Source': 'CPU Diode'},
'TC0H': {'CPU Temp': True, 'Source': 'CPU Heatsink'},
'TC0P': {'CPU Temp': True, 'Source': 'CPU Proximity'},
'TC1C': {'CPU Temp': True, 'Source': 'CPU Core 2'},
'TC1P': {'CPU Temp': True, 'Source': 'CPU Proximity 2'},
'TC2C': {'CPU Temp': True, 'Source': 'CPU Core 3'},
'TC2P': {'CPU Temp': True, 'Source': 'CPU Proximity 3'},
'TC3C': {'CPU Temp': True, 'Source': 'CPU Core 4'},
'TC3P': {'CPU Temp': True, 'Source': 'CPU Proximity 4'},
'TCAC': {'CPU Temp': True, 'Source': 'CPU core from PCECI'},
'TCAH': {'CPU Temp': True, 'Source': 'CPU HeatSink'},
'TCBC': {'CPU Temp': True, 'Source': 'CPU B core from PCECI'},
'TCBH': {'CPU Temp': True, 'Source': 'CPU HeatSink'},
'Te1P': {'CPU Temp': False, 'Source': 'PCIE Ambient'},
'Te1S': {'CPU Temp': False, 'Source': 'PCIE slot 1'},
'Te2S': {'CPU Temp': False, 'Source': 'PCIE slot 2'},
'Te3S': {'CPU Temp': False, 'Source': 'PCIE slot 3'},
'Te4S': {'CPU Temp': False, 'Source': 'PCIE slot 4'},
'TG0C': {'CPU Temp': False, 'Source': 'Mezzanine GPU Core'},
'TG0P': {'CPU Temp': False, 'Source': 'Mezzanine GPU Exhaust'},
'TH0P': {'CPU Temp': False, 'Source': 'Drive Bay 0'},
'TH1P': {'CPU Temp': False, 'Source': 'Drive Bay 1'},
'TH2P': {'CPU Temp': False, 'Source': 'Drive Bay 2'},
'TH3P': {'CPU Temp': False, 'Source': 'Drive Bay 3'},
'TH4P': {'CPU Temp': False, 'Source': 'Drive Bay 4'},
'TM0P': {'CPU Temp': False, 'Source': 'CPU DIMM Exit Ambient'},
'Tp0C': {'CPU Temp': False, 'Source': 'PSU1 Inlet Ambient'},
'Tp0P': {'CPU Temp': False, 'Source': 'PSU1 Inlet Ambient'},
'Tp1C': {'CPU Temp': False, 'Source': 'PSU1 Secondary Component'},
'Tp1P': {'CPU Temp': False, 'Source': 'PSU1 Primary Component'},
'Tp2P': {'CPU Temp': False, 'Source': 'PSU1 Secondary Component'},
'Tp3P': {'CPU Temp': False, 'Source': 'PSU2 Inlet Ambient'},
'Tp4P': {'CPU Temp': False, 'Source': 'PSU2 Primary Component'},
'Tp5P': {'CPU Temp': False, 'Source': 'PSU2 Secondary Component'},
'TS0C': {'CPU Temp': False, 'Source': 'CPU B DIMM Exit Ambient'},
}
STATUS_COLORS = {
'Passed': 'GREEN',
'Aborted': 'YELLOW',
'N/A': 'YELLOW',
'Skipped': 'YELLOW',
'Unknown': 'YELLOW',
'Working': 'YELLOW',
'Denied': 'RED',
'ERROR': 'RED',
'Failed': 'RED',
'TimedOut': 'RED',
}
TEMP_COLORS = {
float('-inf'): 'CYAN',
00: 'BLUE',
60: 'GREEN',
70: 'YELLOW',
80: 'ORANGE',
90: 'RED',
100: 'ORANGE_RED',
}
TESTSTATION_FILE = '/run/archiso/bootmnt/teststation.name'
TEST_MODE_BADBLOCKS_LIMIT = '10000' # Last block to read
TEST_MODE_CPU_LIMIT = 0.25 # Number of minutes to test
# THRESHOLDS: Rates used to determine HDD/SSD pass/fail
THRESH_HDD_MIN = 50 * 1024**2
THRESH_HDD_AVG_HIGH = 75 * 1024**2
THRESH_HDD_AVG_LOW = 65 * 1024**2
THRESH_SSD_MIN = 90 * 1024**2
THRESH_SSD_AVG_HIGH = 135 * 1024**2
THRESH_SSD_AVG_LOW = 100 * 1024**2
# VOLUME THRESHOLDS in percent
VOLUME_WARNING_THRESHOLD = 70
VOLUME_FAILURE_THRESHOLD = 85
if __name__ == '__main__':
print("This file is not meant to be called directly.")

287
scripts/wk/cfg/launchers.py Normal file
View file

@ -0,0 +1,287 @@
"""WizardKit: Config - Launchers (Windows)"""
# vim: sts=2 sw=2 ts=2
LAUNCHERS = {
r'': { # Root Dir
'0) Export BitLocker': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'export_bitlocker.py',
'L_ELEV': 'True',
},
'1) Auto Repairs': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'auto_repairs.py',
'L_ELEV': 'True',
},
'2) Store & Windows Updates': {
'L_TYPE': 'Executable',
'L_PATH': r'%SystemRoot%\System32',
'L_ITEM': 'control.exe',
'L_ARGS': 'update',
'Extra Code': ['explorer ms-windows-store:updates'],
},
'3) Snappy Driver Installer Origin': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'launch_sdio.py',
'L_ELEV': 'True',
},
'4) Auto Setup': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'auto_setup.py',
'L_ELEV': 'True',
},
},
r'Tools': {
'AIDA64': {
'L_TYPE': 'Executable',
'L_PATH': 'AIDA64',
'L_ITEM': 'aida64.exe',
},
'Autoruns (with VirusTotal Scan)': {
'L_TYPE': 'Executable',
'L_PATH': 'Sysinternals',
'L_ITEM': 'Autoruns.exe',
'L_ARGS': '-e',
'Extra Code': [
r'reg add HKCU\Software\Sysinternals\AutoRuns /v checkvirustotal /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownomicrosoft /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownowindows /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v showonlyvirustotal /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v submitvirustotal /t REG_DWORD /d 0 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v verifysignatures /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns\SigCheck /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns\Streams /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns\VirusTotal /v VirusTotalTermsAccepted /t REG_DWORD /d 1 /f >nul',
],
},
'BleachBit': {
'L_TYPE': 'Executable',
'L_PATH': 'BleachBit',
'L_ITEM': 'bleachbit.exe',
},
'BlueScreenView': {
'L_TYPE': 'Executable',
'L_PATH': 'BlueScreenView',
'L_ITEM': 'BlueScreenView.exe',
},
'BCUninstaller': {
'L_TYPE': 'Executable',
'L_PATH': 'BCUninstaller',
'L_ITEM': 'BCUninstaller.exe',
'L_ELEV': 'True',
},
'ConEmu (as ADMIN)': {
'L_TYPE': 'Executable',
'L_PATH': 'ConEmu',
'L_ITEM': 'ConEmu.exe',
'L_ELEV': 'True',
},
'ConEmu': {
'L_TYPE': 'Executable',
'L_PATH': 'ConEmu',
'L_ITEM': 'ConEmu.exe',
},
'Debug Console (Command Prompt)': {
'L_TYPE': 'Executable',
'L_PATH': 'ConEmu',
'L_ITEM': 'ConEmu.exe',
'L_ARGS': r'-Dir %bin%\Scripts',
'L_ELEV': 'True',
},
'Debug Console (Python)': {
'L_TYPE': 'Executable',
'L_PATH': 'ConEmu',
'L_ITEM': 'ConEmu.exe',
'L_ARGS': r'-Dir %bin%\Scripts -Run ..\Python\x%ARCH%\python.exe -i embedded_python_env.py',
'L_ELEV': 'True',
'Extra Code': [
'set ARCH=32',
'if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" set "ARCH=64"',
],
},
'Device Cleanup': {
'L_TYPE': 'Executable',
'L_PATH': 'DeviceCleanup',
'L_ITEM': 'DeviceCleanup.exe',
'L_ELEV': 'True',
},
'Display Driver Uninstaller': {
'L_TYPE': 'Executable',
'L_PATH': 'DDU',
'L_ITEM': 'Display Driver Uninstaller.exe',
'L_ELEV': 'True',
},
'ERUNT': {
'L_TYPE': 'Executable',
'L_PATH': 'erunt',
'L_ITEM': 'ERUNT.EXE',
'L_ARGS': r'%client_dir%\Backups\Registry\%iso_date% sysreg curuser otherusers',
'L_ELEV': 'True',
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Logs',
],
},
'Everything': {
'L_TYPE': 'Executable',
'L_PATH': 'Everything',
'L_ITEM': 'Everything.exe',
'L_ARGS': '-nodb',
'L_ELEV': 'True',
},
'FastCopy (as ADMIN)': {
'L_TYPE': 'Executable',
'L_PATH': 'FastCopy',
'L_ITEM': 'FastCopy.exe',
'L_ARGS': (
r' /logfile=%log_dir%\Tools\FastCopy.log'
r' /acl'
r' /cmd=noexist_only'
r' /skip_empty_dir'
r' /linkdest'
r' /exclude='
r'$RECYCLE.BIN;'
r'$Recycle.Bin;'
r'.AppleDB;'
r'.AppleDesktop;'
r'.AppleDouble;'
r'.com.apple.timemachine.supported;'
r'.dbfseventsd;'
r'.DocumentRevisions-V100*;'
r'.DS_Store;'
r'.fseventsd;'
r'.PKInstallSandboxManager;'
r'.Spotlight*;'
r'.SymAV*;'
r'.symSchedScanLockxz;'
r'.TemporaryItems;'
r'.Trash*;'
r'.vol;'
r'.VolumeIcon.icns;'
r'desktop.ini;'
r'Desktop?DB;'
r'Desktop?DF;'
r'hiberfil.sys;'
r'lost+found;'
r'Network?Trash?Folder;'
r'pagefile.sys;'
r'Recycled;'
r'RECYCLER;'
r'System?Volume?Information;'
r'Temporary?Items;'
r'Thumbs.db'
r' /to=%client_dir%\Transfer_%iso_date%\ '
),
'L_ELEV': 'True',
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Logs /Transfer',
],
},
'FastCopy': {
'L_TYPE': 'Executable',
'L_PATH': 'FastCopy',
'L_ITEM': 'FastCopy.exe',
'L_ARGS': (
r' /logfile=%log_dir%\Tools\FastCopy.log'
r' /acl'
r' /cmd=noexist_only'
r' /skip_empty_dir'
r' /linkdest'
r' /exclude='
r'$RECYCLE.BIN;'
r'$Recycle.Bin;'
r'.AppleDB;'
r'.AppleDesktop;'
r'.AppleDouble;'
r'.com.apple.timemachine.supported;'
r'.dbfseventsd;'
r'.DocumentRevisions-V100*;'
r'.DS_Store;'
r'.fseventsd;'
r'.PKInstallSandboxManager;'
r'.Spotlight*;'
r'.SymAV*;'
r'.symSchedScanLockxz;'
r'.TemporaryItems;'
r'.Trash*;'
r'.vol;'
r'.VolumeIcon.icns;'
r'desktop.ini;'
r'Desktop?DB;'
r'Desktop?DF;'
r'hiberfil.sys;'
r'lost+found;'
r'Network?Trash?Folder;'
r'pagefile.sys;'
r'Recycled;'
r'RECYCLER;'
r'System?Volume?Information;'
r'Temporary?Items;'
r'Thumbs.db'
r' /to=%client_dir%\Transfer_%iso_date%\ '
),
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Logs /Transfer',
],
},
'FurMark': {
'L_TYPE': 'Executable',
'L_PATH': 'FurMark',
'L_ITEM': 'FurMark.exe',
},
'HWiNFO': {
'L_TYPE': 'Executable',
'L_PATH': 'HWiNFO',
'L_ITEM': 'HWiNFO.exe',
'Extra Code': [
r'for %%a in (32 64) do (',
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r')',
],
},
'HWiNFO (Sensors)': {
'L_TYPE': 'Executable',
'L_PATH': 'HWiNFO',
'L_ITEM': 'HWiNFO.exe',
'Extra Code': [
r'for %%a in (32 64) do (',
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SensorsOnly=1)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r')',
],
},
'Notepad++': {
'L_TYPE': 'Executable',
'L_PATH': 'notepadplusplus',
'L_ITEM': 'notepadplusplus.exe',
},
'PuTTY': {
'L_TYPE': 'Executable',
'L_PATH': 'PuTTY',
'L_ITEM': 'PUTTY.EXE',
},
'WizTree': {
'L_TYPE': 'Executable',
'L_PATH': 'WizTree',
'L_ITEM': 'WizTree.exe',
'L_ELEV': 'True',
},
'XMPlay': {
'L_TYPE': 'Executable',
'L_PATH': 'XMPlay',
'L_ITEM': 'xmplay.exe',
'L_ARGS': r'"%bin%\XMPlay\music.7z"',
},
},
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

18
scripts/wk/cfg/log.py Normal file
View file

@ -0,0 +1,18 @@
"""WizardKit: Config - Log"""
# vim: sts=2 sw=2 ts=2
DEBUG = {
'level': 'DEBUG',
'format': '[%(asctime)s %(levelname)s] [%(name)s.%(funcName)s] %(message)s',
'datefmt': '%Y-%m-%d %H%M%S%z',
}
DEFAULT = {
'level': 'INFO',
'format': '[%(asctime)s %(levelname)s] %(message)s',
'datefmt': '%Y-%m-%d %H%M%z',
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

35
scripts/wk/cfg/main.py Normal file
View file

@ -0,0 +1,35 @@
"""WizardKit: Config - Main
NOTE: Non-standard formating is used for BASH/BATCH/PYTHON compatibility
"""
# vim: sts=2 sw=2 ts=2
# Features
ENABLED_OPEN_LOGS=False
ENABLED_TICKET_NUMBERS=False
ENABLED_UPLOAD_DATA=False
# Main Kit
ARCHIVE_PASSWORD='Abracadabra'
KIT_NAME_FULL='WizardKit'
KIT_NAME_SHORT='WK'
SUPPORT_MESSAGE='Please let 2Shirt know by opening an issue on Gitea'
# Text Formatting
INDENT=4
WIDTH=32
# Live Linux
ROOT_PASSWORD='Abracadabra'
TECH_PASSWORD='Abracadabra'
# Time Zones
## See 'timedatectl list-timezones' for valid Linux values
## See 'tzutil /l' for valid Windows values
LINUX_TIME_ZONE='America/Los_Angeles'
WINDOWS_TIME_ZONE='Pacific Standard Time'
if __name__ == '__main__':
print("This file is not meant to be called directly.")

76
scripts/wk/cfg/music.py Normal file
View file

@ -0,0 +1,76 @@
"""WizardKit: Config - Music Sources"""
# vim: sts=2 sw=2 ts=2
MUSIC_MOD = (
('33432', 'ambrozia.xm'),
('33460', 'amigatre.mod'),
('34594', 'CHARIOT.S3M'),
('34596', 'BUTTERFL.XM'),
('34654', 'CTGOBLIN.S3M'),
('35151', 'bananasplit.mod'),
('35280', 'DEADLOCK.XM'),
('38591', 'compo_liam.xm'),
('39987', 'crystald.s3m'),
('40475', 'ELYSIUM.MOD'),
('42146', 'enigma.mod'),
('42519', 'GHOST2.MOD'),
('42560', 'GSLINGER.MOD'),
('42872', 'existing.xm'),
('50427', 'nf-stven.xm'),
('51549', 'overture.mod'),
('54250', 'SATELL.S3M'),
('54313', 'realmk.s3m'),
('55789', 'scrambld.mod'),
('57934', 'spacedeb.mod'),
('59344', 'stardstm.mod'),
('60395', '2ND_PM.S3M'),
('66187', 'external.xm'),
('66343', 'beek-substitutionology.it'),
('67561', 'radix-unreal_superhero.xm'),
('70829', 'inside_out.s3m'),
('83779', 'beyond_music.mod'),
('104208', 'banana_boat.mod'),
('114971', 'tilbury_fair.mod'),
('132563', 'ufo_tune.mod'),
('135906', 'magnetik_girl.xm'),
('140628', 'autumn_in_budapest.xm'),
('143198', 'summer_memories_3.xm'),
('144405', 'hillbilly_billyboy.xm'),
('154795', '4mat_-_eternity.xm'),
('155845', 'bookworm.mo3'),
('155914', 'battleofsteel.xm'),
('158975', '1_channel_moog.it'),
('165495', 'trans.s3m'),
('168513', 'necros_-_introspection.s3m'),
('169628', 'radix_-_feng_shui_schematics.xm'),
('175238', 'unknown48_-_twilight.mod'),
)
MUSIC_SNES = (
'actr',
'crock',
'ct',
'dkc',
'dkq',
'ff6',
'fz',
'loz3',
'mmx',
'ptws',
'scv4',
'sf',
'sf2',
'sgng',
'smk',
'smw',
'yi',
'zamn',
)
MUSIC_SNES_BAD = {
'ct': ['ct-s*', 'ct-v*'],
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")
# vim: sts=2 sw=2 ts=2

41
scripts/wk/cfg/net.py Normal file
View file

@ -0,0 +1,41 @@
"""WizardKit: Config - Net"""
# vim: sts=2 sw=2 ts=2
# Servers
BACKUP_SERVERS = {
#'Server One': {
# 'Address': '10.0.0.10',
# 'Share': 'Backups',
# 'RO-User': 'restore',
# 'RO-Pass': 'Abracadabra',
# 'RW-User': 'backup',
# 'RW-Pass': 'Abracadabra',
# },
#'Server Two': {
# 'Address': 'servertwo.example.com',
# 'Share': 'Backups',
# 'RO-User': 'restore',
# 'RO-Pass': 'Abracadabra',
# 'RW-User': 'backup',
# 'RW-Pass': 'Abracadabra',
# },
}
CRASH_SERVER = {
#'Name': 'CrashServer',
#'Url': '',
#'User': '',
#'Pass': '',
#'Headers': {'X-Requested-With': 'XMLHttpRequest'},
}
SDIO_SERVER = {
'Address': '',
'Share': '',
'Path': '',
'RO-User': '',
'RO-Pass': '',
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

99
scripts/wk/cfg/repairs.py Normal file
View file

@ -0,0 +1,99 @@
"""WizardKit: Config - Repairs"""
# vim: sts=2 sw=2 ts=2
from wk.cfg.main import KIT_NAME_FULL
AUTO_REPAIR_DELAY_IN_SECONDS = 3
AUTO_REPAIR_KEY = fr'Software\{KIT_NAME_FULL}\Auto Repairs'
BLEACH_BIT_CLEANERS = (
# Applications
'adobe_reader.cache',
'adobe_reader.tmp',
'amule.temp',
'discord.cache',
'flash.cache',
'gimp.tmp',
'google_earth.temporary_files',
'gpodder.cache',
'hippo_opensim_viewer.cache',
'java.cache',
'miro.cache',
'openofficeorg.cache',
'pidgin.cache',
'seamonkey.cache',
'secondlife_viewer.Cache',
'silverlight.temp',
'slack.cache',
'smartftp.cache',
'thunderbird.cache',
'vuze.cache',
'vuze.temp',
'windows_media_player.cache',
'winrar.temp',
'yahoo_messenger.cache',
'zoom.cache',
# Browsers
'brave.cache',
'brave.session',
'chromium.cache',
'chromium.search_engines',
'chromium.session',
'firefox.cache',
'firefox.session_restore',
'google_chrome.cache',
'google_chrome.session',
'internet_explorer.cache',
'microsoft_edge.cache',
'microsoft_edge.session',
'opera.cache',
'opera.session',
'palemoon.cache',
'palemoon.session_restore',
'safari.cache',
'waterfox.cache',
'waterfox.session_restore',
# System
'system.clipboard',
'system.tmp',
'windows_defender.temp',
'windows_explorer.run',
'windows_explorer.thumbnails',
)
CUSTOM_POWER_PLAN_NAME = f'{KIT_NAME_FULL} Power Plan'
CUSTOM_POWER_PLAN_DESC = 'Customized for the best experience.'
POWER_PLANS = {
'Balanced': '381b4222-f694-41f0-9685-ff5bb260df2e',
'Custom': '01189998-8199-9119-725c-ccccccccccc3',
'High Performance': '8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c',
}
POWER_PLAN_SLEEP_TIMEOUTS = {
'Balanced': ('1800', '900'),
'High Performance': ('0', '0'),
}
REG_UAC_DEFAULTS_WIN7 = {
'HKLM': {
r'Software\Microsoft\Windows\CurrentVersion\Policies\System': (
('ConsentPromptBehaviorAdmin', 5, 'DWORD'),
('EnableLUA', 1, 'DWORD'),
('PromptOnSecureDesktop', 1, 'DWORD'),
),
},
}
REG_UAC_DEFAULTS_WIN10 = {
'HKLM': {
r'Software\Microsoft\Windows\CurrentVersion\Policies\System': (
('ConsentPromptBehaviorAdmin', 5, 'DWORD'),
('ConsentPromptBehaviorUser', 3, 'DWORD'),
('EnableInstallerDetection', 1, 'DWORD'),
('EnableLUA', 1, 'DWORD'),
('EnableVirtualization', 1, 'DWORD'),
('PromptOnSecureDesktop', 1, 'DWORD'),
),
},
}
WIDTH = 50
if __name__ == '__main__':
print("This file is not meant to be called directly.")

219
scripts/wk/cfg/setup.py Normal file
View file

@ -0,0 +1,219 @@
"""WizardKit: Config - Setup"""
# vim: sts=2 sw=2 ts=2
BROWSER_PATHS = {
# Relative to PROGRAMFILES_64, PROGRAMFILES_32, LOCALAPPDATA (in that order)
'Google Chrome': 'Google/Chrome/Application/chrome.exe',
'Mozilla Firefox': 'Mozilla Firefox/firefox.exe',
'Microsoft Edge': 'Microsoft/Edge/Application/msedge.exe',
'Opera': 'Opera/launcher.exe',
}
DISABLED_ENTRIES_WINDOWS_11 = {
# Group Name: Option Name
'Install Software': 'Open Shell',
'Configure System': 'Open Shell',
}
LIBREOFFICE_XCU_DATA = '''<?xml version="1.0" encoding="UTF-8"?>
<oor:items xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<item oor:path="/org.openoffice.Setup/Office/Factories/org.openoffice.Setup:Factory['com.sun.star.presentation.PresentationDocument']"><prop oor:name="ooSetupFactoryDefaultFilter" oor:op="fuse"><value>Impress MS PowerPoint 2007 XML</value></prop></item>
<item oor:path="/org.openoffice.Setup/Office/Factories/org.openoffice.Setup:Factory['com.sun.star.sheet.SpreadsheetDocument']"><prop oor:name="ooSetupFactoryDefaultFilter" oor:op="fuse"><value>Calc MS Excel 2007 XML</value></prop></item>
<item oor:path="/org.openoffice.Setup/Office/Factories/org.openoffice.Setup:Factory['com.sun.star.text.TextDocument']"><prop oor:name="ooSetupFactoryDefaultFilter" oor:op="fuse"><value>MS Word 2007 XML</value></prop></item>
<item oor:path="/org.openoffice.Office.Common/Save/Document"><prop oor:name="WarnAlienFormat" oor:op="fuse"><value>false</value></prop></item>
</oor:items>
'''
REG_CHROME_UBLOCK_ORIGIN = {
'HKLM': {
r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': (
('update_url', 'https://clients2.google.com/service/update2/crx', 'SZ', '32'),
)
},
}
REG_WINDOWS_BSOD_MINIDUMPS = {
'HKLM': {
# Enable small memory dumps
r'SYSTEM\CurrentControlSet\Control\CrashControl': (
('CrashDumpEnabled', 3, 'DWORD'),
)
}
}
REG_WINDOWS_EXPLORER = {
'HKLM': {
# Allow password sign-in for MS accounts
r'Software\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device': (
('DevicePasswordLessBuildVersion', 0, 'DWORD'),
),
# Disable Location Tracking
r'Software\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}': (
('SensorPermissionState', 0, 'DWORD'),
),
r'System\CurrentControlSet\Services\lfsvc\Service\Configuration': (
('Status', 0, 'DWORD'),
),
# Disable Telemetry
r'Software\Microsoft\Windows\CurrentVersion\Policies\DataCollection': (
('AllowTelemetry', 0, 'DWORD'),
('AllowTelemetry', 0, 'DWORD', '32'),
),
r'Software\Policies\Microsoft\Windows\DataCollection': (
('AllowTelemetry', 0, 'DWORD'),
),
# Disable floating Bing search widget
r'Software\Policies\Microsoft\Edge': (
('WebWidgetAllowed', 0, 'DWORD'),
),
# Disable Edge first run screen
r'Software\Policies\Microsoft\MicrosoftEdge\Main': (
('PreventFirstRunPage', 1, 'DWORD'),
),
# Disable Wi-Fi Sense
r'Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting': (
('Value', 0, 'DWORD'),
),
r'Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots': (
('Value', 0, 'DWORD'),
),
},
'HKCU': {
# Desktop theme (<= v1809 default)
r'Software\Microsoft\Windows\CurrentVersion\Themes\Personalize': (
('AppsUseLightTheme', 1, 'DWORD'),
('SystemUsesLightTheme', 0, 'DWORD'),
),
# Disable features
r'Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager': (
('SilentInstalledAppsEnabled', 0, 'DWORD'),
# Tips and Tricks
('SoftLandingEnabled ', 0, 'DWORD'),
('SubscribedContent-338389Enabled', 0, 'DWORD'),
),
# Disable news and interests from opening on hover
r'Software\Microsoft\Windows\CurrentVersion\Feeds': (
('ShellFeedsTaskbarOpenOnHover', 0, 'DWORD'),
),
# Disable search highlights
r'Software\Microsoft\Windows\CurrentVersion\Feeds\DSB': (
('ShowDynamicContent', 0, 'DWORD'),
),
# File Explorer
r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced': (
# Change default Explorer view to "Computer"
('LaunchTo', 1, 'DWORD'),
('SeparateProcess', 1, 'DWORD'),
),
# Hide People bar
r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\People': (
('PeopleBand', 0, 'DWORD'),
),
# Hide Search button / box
r'Software\Microsoft\Windows\CurrentVersion\Search': (
('SearchboxTaskbarMode', 1, 'DWORD'),
),
# Disable search highlights from opening on hover
r'Software\Microsoft\Windows\CurrentVersion\SearchSettings': (
('IsDynamicSearchBoxEnabled', 0, 'DWORD'),
),
# Disable "Let's make Windows even better" screens
r'Software\Microsoft\Windows\CurrentVersion\UserProfileEngagement': (
('ScoobeSystemSettingEnabled', 0, 'DWORD'),
),
},
}
REG_OPEN_SHELL_SETTINGS = {
'HKCU': {
r'Software\OpenShell\StartMenu': (
('ShowedStyle2', 1, 'DWORD'),
),
r'Software\OpenShell\StartMenu\Settings': (
('HighlightNew', 0, 'DWORD'),
('MenuStyle', 'Win7', 'SZ'),
('RecentPrograms', 'Recent', 'SZ'),
('SkinW7', 'Fluent-Metro', 'SZ'),
('SkinVariationW7', '', 'SZ'),
('SkipMetro', 1, 'DWORD'),
(
'SkinOptionsW7',
[
# NOTE: All options need to be specified to work
'DARK_MAIN=1', 'METRO_MAIN=0', 'LIGHT_MAIN=0', 'AUTOMODE_MAIN=0',
'DARK_SUBMENU=0', 'METRO_SUBMENU=0', 'LIGHT_SUBMENU=0', 'AUTOMODE_SUBMENU=1',
'SUBMENU_SEPARATORS=1', 'DARK_SEARCH=0', 'METRO_SEARCH=0', 'LIGHT_SEARCH=1',
'AUTOMODE_SEARCH=0', 'SEARCH_FRAME=1', 'SEARCH_COLOR=0', 'SMALL_SEARCH=0',
'MODERN_SEARCH=1', 'SEARCH_ITALICS=0', 'NONE=0', 'SEPARATOR=0',
'TWO_TONE=1', 'CLASSIC_SELECTOR=1', 'HALF_SELECTOR=0', 'CURVED_MENUSEL=1',
'CURVED_SUBMENU=0', 'SELECTOR_REVEAL=0', 'TRANSPARENT=0', 'OPAQUE_SUBMENU=1',
'OPAQUE_MENU=0', 'OPAQUE=0', 'STANDARD=1', 'SMALL_MAIN2=0',
'SMALL_ICONS=0', 'COMPACT_SUBMENU=0', 'PRESERVE_MAIN2=0', 'LESS_PADDING=0',
'EXTRA_PADDING=1', '24_PADDING=0', 'LARGE_PROGRAMS=0', 'TRANSPARENT_SHUTDOWN=0',
'OUTLINE_SHUTDOWN=0', 'BUTTON_SHUTDOWN=1', 'EXPERIMENTAL_SHUTDOWN=0', 'LARGE_FONT=0',
'CONNECTED_BORDER=1', 'FLOATING_BORDER=0', 'LARGE_SUBMENU=0', 'LARGE_LISTS=0',
'THIN_MAIN2=0', 'EXPERIMENTAL_MAIN2=1', 'USER_IMAGE=1', 'USER_OUTSIDE=0',
'SCALING_USER=1', '56=0', '64=0', 'TRANSPARENT_USER=0',
'UWP_SCROLLBAR=1', 'MODERN_SCROLLBAR=0', 'OLD_ICONS=0', 'NEW_ICONS=1',
'SMALL_ARROWS=0', 'ICON_FRAME=0', 'SEARCH_SEPARATOR=0', 'NO_PROGRAMS_BUTTON=0',
],
'MULTI_SZ',
),
),
},
}
REG_OPEN_SHELL_LOW_POWER_IDLE = {
'HKCU': {
r'Software\OpenShell\StartMenu': (
(
'CSettingsDlg',
b'h\x02\x00\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\r\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00',
'BINARY',
),
(
'CEditMenuDlg7',
b'\xde\x02\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
'BINARY',
),
),
r'Software\OpenShell\StartMenu\Settings': (
('ShutdownW7', 'switch_user, logoff, lock, restart, hibernate', 'SZ'),
(
'MenuItems7',
[
'Item1.Command=user_files', 'Item1.Settings=NOEXPAND',
'Item2.Command=user_documents', 'Item2.Settings=NOEXPAND',
'Item3.Command=user_pictures', 'Item3.Settings=NOEXPAND',
'Item4.Command=user_music', 'Item4.Settings=NOEXPAND',
'Item5.Command=user_videos', 'Item5.Settings=ITEM_DISABLED',
'Item6.Command=downloads', 'Item6.Settings=ITEM_DISABLED',
'Item7.Command=homegroup', 'Item7.Settings=ITEM_DISABLED',
'Item8.Command=separator',
'Item9.Command=games', 'Item9.Settings=TRACK_RECENT|NOEXPAND|ITEM_DISABLED',
'Item10.Command=favorites', 'Item10.Settings=ITEM_DISABLED',
'Item11.Command=recent_documents',
'Item12.Command=computer', 'Item12.Settings=NOEXPAND',
'Item13.Command=network', 'Item13.Settings=ITEM_DISABLED',
'Item14.Command=network_connections', 'Item14.Settings=ITEM_DISABLED',
'Item15.Command=separator',
'Item16.Command=control_panel', 'Item16.Settings=TRACK_RECENT',
'Item17.Command=pc_settings', 'Item17.Settings=TRACK_RECENT',
'Item18.Command=admin', 'Item18.Settings=TRACK_RECENT|ITEM_DISABLED',
'Item19.Command=devices', 'Item19.Settings=NOEXPAND',
'Item20.Command=defaults',
'Item21.Command=help',
'Item22.Command=run',
'Item23.Command=monitor_off', 'Item23.Label=Sleep', 'Item23.Settings=NOEXPAND',
'Item24.Command=apps', 'Item24.Settings=ITEM_DISABLED',
'Item25.Command=windows_security',
],
'MULTI_SZ',
),
),
},
}
UBLOCK_ORIGIN_URLS = {
'Google Chrome': 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm',
'Microsoft Edge': 'https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak',
'Mozilla Firefox': 'https://addons.mozilla.org/addon/ublock-origin/',
'Opera': 'https://addons.opera.com/extensions/details/ublock/',
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

62
scripts/wk/cfg/sources.py Normal file
View file

@ -0,0 +1,62 @@
"""WizardKit: Config - Tool Sources"""
# vim: sts=2 sw=2 ts=2
# Download frequency in days
DOWNLOAD_FREQUENCY = 7
# Sources
SOURCES = {
# Main
'AVRemover32': 'https://download.eset.com/com/eset/tools/installers/av_remover/latest/avremover_nt32_enu.exe',
'AVRemover64': 'https://download.eset.com/com/eset/tools/installers/av_remover/latest/avremover_nt64_enu.exe',
'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner',
'Autologon32': 'http://live.sysinternals.com/Autologon.exe',
'Autologon64': 'http://live.sysinternals.com/Autologon64.exe',
'Firefox32': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win&lang=en-US',
'Firefox64': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US',
'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe',
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
'KVRT': 'https://devbuilds.s.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe',
'RKill': 'https://download.bleepingcomputer.com/grinler/rkill.exe',
'RegDelNull': 'https://live.sysinternals.com/RegDelNull.exe',
'RegDelNull64': 'https://live.sysinternals.com/RegDelNull64.exe',
# Build Kit
'AIDA64': 'https://download.aida64.com/aida64engineer692.zip',
'Adobe Reader DC': 'https://ardownload2.adobe.com/pub/adobe/reader/win/AcrobatDC/2300620360/AcroRdrDC2300620360_en_US.exe',
'Aria2': 'https://github.com/aria2/aria2/releases/download/release-1.36.0/aria2-1.36.0-win-32bit-build1.zip',
'Autoruns32': 'http://live.sysinternals.com/Autoruns.exe',
'Autoruns64': 'http://live.sysinternals.com/Autoruns64.exe',
'BleachBit': 'https://download.bleachbit.org/BleachBit-4.4.2-portable.zip',
'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip',
'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip',
'BCUninstaller': 'https://github.com/Klocman/Bulk-Crap-Uninstaller/releases/download/v5.7/BCUninstaller_5.7_portable.zip',
'DDU': 'https://www.wagnardsoft.com/DDU/download/DDU%20v18.0.6.8.exe',
'ERUNT': 'http://www.aumha.org/downloads/erunt.zip',
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.1024.x86.zip',
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.1024.x64.zip',
'FastCopy': 'https://github.com/FastCopyLab/FastCopyDist2/raw/main/FastCopy5.4.2_installer.exe',
'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.3/Fluent-Metro_1.5.3.zip',
'FurMark': 'https://geeks3d.com/dl/get/728',
'HWiNFO': 'https://www.sac.sk/download/utildiag/hwi_764.zip',
'LibreOffice32': 'https://download.documentfoundation.org/libreoffice/stable/7.6.2/win/x86/LibreOffice_7.6.2_Win_x86.msi',
'LibreOffice64': 'https://download.documentfoundation.org/libreoffice/stable/7.6.2/win/x86_64/LibreOffice_7.6.2_Win_x86-64.msi',
'Macs Fan Control': 'https://www.crystalidea.com/downloads/macsfancontrol_setup.exe',
'Neutron': 'http://keir.net/download/neutron.zip',
'Notepad++': 'https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.5.8/npp.8.5.8.portable.minimalist.7z',
'OpenShell': 'https://github.com/Open-Shell/Open-Shell-Menu/releases/download/v4.4.191/OpenShellSetup_4_4_191.exe',
'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip',
'SDIO Torrent': 'https://www.glenn.delahoy.com/downloads/sdio/SDIO_Update.torrent',
'WizTree': 'https://diskanalyzer.com/files/wiztree_4_15_portable.zip',
'XMPlay': 'https://support.xmplay.com/files/20/xmplay385.zip?v=47090',
'XMPlay 7z': 'https://support.xmplay.com/files/16/xmp-7z.zip?v=800962',
'XMPlay Game': 'https://support.xmplay.com/files/12/xmp-gme.zip?v=515637',
'XMPlay RAR': 'https://support.xmplay.com/files/16/xmp-rar.zip?v=409646',
'XMPlay Innocuous': 'https://support.xmplay.com/files/10/Innocuous%20(v1.7).zip?v=645281',
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

95
scripts/wk/cfg/ufd.py Normal file
View file

@ -0,0 +1,95 @@
"""WizardKit: Config - UFD"""
# vim: sts=2 sw=2 ts=2
from wk.cfg.main import KIT_NAME_FULL
# General
SOURCES = {
'Linux': {'Arg': '--linux', 'Type': 'ISO'},
'WinPE': {'Arg': '--winpe', 'Type': 'ISO'},
'Main Kit': {'Arg': '--main-kit', 'Type': 'KIT'},
'Extra Dir': {'Arg': '--extra-dir', 'Type': 'DIR'},
}
# Definitions: Boot entries
BOOT_ENTRIES = {
# Path to check: Comment to remove
'/sources/boot.wim': 'UFD-WINPE',
}
BOOT_FILES = {
# Directory: extension
'/syslinux': 'cfg',
'/EFI/boot': 'conf',
}
IMAGE_BOOT_ENTRIES = {
'El Capitan': 'UFD-MACOS-10.11',
'High Sierra': 'UFD-MACOS-10.13',
'Catalina': 'UFD-MACOS-10.15',
}
# Definitions: Sources and Destinations
## NOTES: Paths are relative to the root of the ISO/UFD
## Sources use rsync's trailing slash syntax
ITEMS = {
'Extra Dir': (
('/', '/'),
),
'Linux': (
('/arch', '/'),
),
'Main Kit': (
('/', f'/{KIT_NAME_FULL}/'),
),
'WinPE': (
('/bootmgr', '/'),
('/bootmgr.efi', '/'),
('/en_us', '/'),
('/Boot/', '/boot/'),
('/EFI/Boot/', '/EFI/Microsoft/'),
('/EFI/Microsoft/', '/EFI/Microsoft/'),
('/Boot/BCD', '/sources/'),
('/Boot/boot.sdi', '/sources/'),
('/bootmgr', '/sources/'),
('/sources/boot.wim', '/sources/'),
),
}
ITEMS_FROM_LIVE = {
'WizardKit UFD base': (
('/usr/share/WizardKit/', '/'),
),
'rEFInd': (
('/usr/share/refind/drivers_x64/', '/EFI/Boot/drivers_x64/'),
('/usr/share/refind/icons/', '/EFI/Boot/icons/'),
('/usr/share/refind/refind_x64.efi', '/EFI/Boot/'),
),
'Syslinux': (
('/usr/lib/syslinux/bios/', '/syslinux/'),
),
'Memtest86': (
('/usr/share/memtest86-efi/', '/EFI/Memtest86/'),
),
'Wimboot': (
('/usr/share/wimboot/', '/syslinux/'),
),
}
ITEMS_HIDDEN = (
# Linux (all versions)
'arch',
'EFI',
'syslinux',
# Main Kit
f'{KIT_NAME_FULL}/.bin',
f'{KIT_NAME_FULL}/.cbin',
# WinPE
'boot',
'bootmgr',
'bootmgr.efi',
'en-us',
'images',
'sources',
)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -0,0 +1,43 @@
"""WizardKit: Config - Windows Builds"""
# vim: sts=2 sw=2 ts=2
OLDEST_SUPPORTED_BUILD = 19041 # Windows 10 20H1
OUTDATED_BUILD_NUMBERS = (
9600, # Windows 8.1 Update
18363, # Windows 10 19H2
)
WINDOWS_BUILDS = {
# Windows 7
'6.1.7600': 'RTM "Vienna"',
'6.1.7601': 'SP1 "Vienna"',
# Windows 8
'6.2.9200': 'RTM',
# Widnows 8.1
'6.3.9200': '"Blue"',
'6.3.9600': '"Update"',
# Windows 10
'10.0.10240': '1507 "Threshold 1"',
'10.0.10586': '1511 "Threshold 2"',
'10.0.14393': '1607 "Redstone 1"',
'10.0.15063': '1703 "Redstone 2"',
'10.0.16299': '1709 "Redstone 3"',
'10.0.17134': '1803 "Redstone 4"',
'10.0.17763': '1809 "Redstone 5"',
'10.0.18362': '1903 / 19H1',
'10.0.18363': '1909 / 19H2',
'10.0.19041': '2004 / 20H1',
'10.0.19042': '20H2',
'10.0.19043': '21H1',
'10.0.19044': '21H2',
'10.0.19045': '22H2',
# Windows 11
'10.0.22000': '21H2',
'10.0.22621': '22H2',
'10.0.22631': '23H2',
'10.0.26100': '24H2',
}

View file

@ -0,0 +1,32 @@
{
"$schema": "https://aka.ms/winget-packages.schema.2.0.json",
"CreationDate": "2023-06-25T01:40:45.003-00:00",
"Sources": [
{
"Packages": [
{
"PackageIdentifier": "7zip.7zip"
},
{
"PackageIdentifier": "Google.Chrome"
},
{
"PackageIdentifier": "Microsoft.Edge"
},
{
"PackageIdentifier": "Mozilla.Firefox"
},
{
"PackageIdentifier": "VideoLAN.VLC"
}
],
"SourceDetails": {
"Argument": "https://cdn.winget.microsoft.com/cache",
"Identifier": "Microsoft.Winget.Source_8wekyb3d8bbwe",
"Name": "winget",
"Type": "Microsoft.PreIndexed.Package"
}
}
],
"WinGetVersion": "1.4.11071"
}

View file

@ -0,0 +1,29 @@
{
"$schema": "https://aka.ms/winget-packages.schema.2.0.json",
"CreationDate": "2023-06-25T01:40:45.003-00:00",
"Sources": [
{
"Packages": [
{
"PackageIdentifier": "Microsoft.VCRedist.2013.x64"
},
{
"PackageIdentifier": "Microsoft.VCRedist.2013.x86"
},
{
"PackageIdentifier": "Microsoft.VCRedist.2015+.x64"
},
{
"PackageIdentifier": "Microsoft.VCRedist.2015+.x86"
}
],
"SourceDetails": {
"Argument": "https://cdn.winget.microsoft.com/cache",
"Identifier": "Microsoft.Winget.Source_8wekyb3d8bbwe",
"Name": "winget",
"Type": "Microsoft.PreIndexed.Package"
}
}
],
"WinGetVersion": "1.4.11071"
}

View file

@ -0,0 +1,7 @@
"""WizardKit: ddrescue-tui module init"""
from . import block_pair
from . import ddrescue
from . import image
from . import menus
from . import state

View file

@ -0,0 +1,575 @@
"""WizardKit: ddrescue TUI - Block Pairs"""
# vim: sts=2 sw=2 ts=2
import logging
import math
import os
import pathlib
import plistlib
import re
import subprocess
from wk import cfg, exe, std
from wk.clone import menus
from wk.hw import disk as hw_disk
from wk.ui import ansi, cli
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
DDRESCUE_LOG_REGEX = re.compile(
r'^\s*(?P<key>\S+):\s+'
r'(?P<size>\d+)\s+'
r'(?P<unit>[PTGMKB]i?B?)'
r'.*\(\s*(?P<percent>\d+\.?\d*)%\)$',
re.IGNORECASE,
)
# Classes
class BlockPair():
"""Object for tracking source to dest recovery data."""
def __init__(
self,
source_dev: hw_disk.Disk,
destination: pathlib.Path,
working_dir: pathlib.Path,
):
self.sector_size: int = source_dev.phy_sec
self.source: pathlib.Path = pathlib.Path(source_dev.path)
self.destination: pathlib.Path = destination
self.map_data: dict[str, bool | int] = {}
self.map_path: pathlib.Path = pathlib.Path()
self.size: int = source_dev.size
self.status: dict[str, float | int | str] = {
'read-skip': 'Pending',
'read-full': 'Pending',
'trim': 'Pending',
'scrape': 'Pending',
}
self.test_map: pathlib.Path | None = None
self.view_map: bool = 'DISPLAY' in os.environ or 'WAYLAND_DISPLAY' in os.environ
self.view_proc: subprocess.Popen | None = None
# Set map path
# e.g. '(Clone|Image)_Model_Serial[_p#]_Size[_Label].map'
map_name = f'{source_dev.model}_{source_dev.serial}'
if source_dev.bus == 'Image':
map_name = 'Image'
if source_dev.parent:
part_num = re.sub(r"^.*?(\d+)$", r"\1", self.source.name)
map_name += f'_p{part_num}'
size_str = std.bytes_to_string(
size=self.size,
use_binary=False,
)
map_name += f'_{size_str.replace(" ", "")}'
if source_dev.raw_details.get('label', ''):
map_name += f'_{source_dev.raw_details["label"]}'
map_name = map_name.replace(' ', '_')
map_name = map_name.replace('/', '_')
map_name = map_name.replace('\\', '_')
if destination.is_dir():
# Imaging
self.map_path = pathlib.Path(f'{destination}/Image_{map_name}.map')
self.destination = self.map_path.with_suffix('.dd')
self.destination.touch()
else:
# Cloning
self.map_path = pathlib.Path(f'{working_dir}/Clone_{map_name}.map')
# Create map file if needed
# NOTE: We need to set the domain size for --complete-only to work
if not self.map_path.exists():
self.map_path.write_text(
data=cfg.ddrescue.DDRESCUE_MAP_TEMPLATE.format(
name=cfg.main.KIT_NAME_FULL,
size=self.size,
),
encoding='utf-8',
)
# Set initial status
self.set_initial_status()
def __getstate__(self):
"""Override to allow pickling ddrescue.State() objects."""
bp_state = self.__dict__.copy()
del bp_state['view_proc']
return bp_state
def get_error_size(self) -> int:
"""Get error size in bytes, returns int."""
return self.size - self.get_rescued_size()
def get_percent_recovered(self) -> float:
"""Get percent rescued from map_data, returns float."""
return 100 * self.map_data.get('rescued', 0) / self.size
def get_rescued_size(self) -> int:
"""Get rescued size using map data.
NOTE: Returns 0 if no map data is available.
"""
self.load_map_data()
return self.map_data.get('rescued', 0)
def load_map_data(self) -> None:
"""Load map data from file.
NOTE: If the file is missing it is assumed that recovery hasn't
started yet so default values will be returned instead.
"""
data: dict[str, bool | int] = {'full recovery': False, 'pass completed': False}
# Get output from ddrescuelog
cmd = [
'ddrescuelog',
'--binary-prefixes',
'--show-status',
f'--size={self.size}',
self.map_path,
]
proc = exe.run_program(cmd, check=False)
# Parse output
for line in proc.stdout.splitlines():
_r = DDRESCUE_LOG_REGEX.search(line)
if _r:
if _r.group('key') == 'rescued' and _r.group('percent') == '100':
# Fix rounding errors from ddrescuelog output
data['rescued'] = self.size
else:
data[_r.group('key')] = std.string_to_bytes(
f'{_r.group("size")} {_r.group("unit")}',
)
data['pass completed'] = 'current status: finished' in line.lower()
# Check if 100% done (only if map is present and non-zero size
# NOTE: ddrescuelog returns 0 (i.e. 100% done) for empty files
if self.map_path.exists() and self.map_path.stat().st_size != 0:
cmd = [
'ddrescuelog',
'--done-status',
f'--size={self.size}',
self.map_path,
]
proc = exe.run_program(cmd, check=False)
data['full recovery'] = proc.returncode == 0
# Done
self.map_data.update(data)
def pass_complete(self, pass_name) -> bool:
"""Check if pass_name is complete based on map data, returns bool."""
pending_size = self.map_data['non-tried']
# Full recovery
if self.map_data.get('full recovery', False):
return True
# New recovery
if 'non-tried' not in self.map_data:
return False
# Initial read skip pass
if pass_name == 'read-skip':
pass_threshold = cfg.ddrescue.AUTO_PASS_THRESHOLDS[pass_name]
if self.get_percent_recovered() >= pass_threshold:
return True
# Recovery in progress
if pass_name in ('trim', 'scrape'):
pending_size += self.map_data['non-trimmed']
if pass_name == 'scrape':
pending_size += self.map_data['non-scraped']
if pending_size == 0:
# This is true when the previous and current passes are complete
return True
# This should never be reached
return False
def safety_check(self) -> None:
"""Run safety check and abort if necessary."""
# TODO: Expand section to support non-Linux systems
dest_size = -1
if self.destination.is_block_device():
cmd = [
'lsblk', '--bytes', '--json',
'--nodeps', '--noheadings', '--output=size',
self.destination,
]
json_data = exe.get_json_from_command(cmd)
dest_size = json_data['blockdevices'][0]['size']
del json_data
# Check destination size if cloning
if not self.destination.is_file() and dest_size < self.size:
cli.print_error(f'Invalid destination: {self.destination}')
raise std.GenericAbort()
def set_initial_status(self) -> None:
"""Read map data and set initial statuses."""
self.load_map_data()
percent = self.get_percent_recovered()
for name in self.status:
if self.pass_complete(name):
self.status[name] = percent
else:
# Stop checking
if percent > 0:
self.status[name] = percent
break
def skip_pass(self, pass_name) -> None:
"""Mark pass as skipped if applicable."""
if self.status[pass_name] == 'Pending':
self.status[pass_name] = 'Skipped'
def update_progress(self, pass_name) -> None:
"""Update progress via map data."""
self.load_map_data()
# Update status
percent = self.get_percent_recovered()
if percent > 0:
self.status[pass_name] = percent
# Mark future passes as skipped if applicable
if percent == 100:
status_keys = list(self.status.keys())
for pass_n in status_keys[status_keys.index(pass_name)+1:]:
self.status[pass_n] = 'Skipped'
# Functions
def add_clone_block_pairs(state) -> list[hw_disk.Disk]:
"""Add device to device block pairs and set settings if necessary."""
source_sep = get_partition_separator(state.source.path.name)
dest_sep = get_partition_separator(state.destination.path.name)
settings = {}
# Clone settings
settings = state.load_settings(discard_unused_settings=True)
# Add pairs from previous run
if settings['Partition Mapping']:
source_parts = []
for part_map in settings['Partition Mapping']:
bp_source = hw_disk.Disk(
f'{state.source.path}{source_sep}{part_map[0]}',
)
bp_dest = pathlib.Path(
f'{state.destination.path}{dest_sep}{part_map[1]}',
)
source_parts.append(bp_source)
state.add_block_pair(bp_source, bp_dest)
return source_parts
# Add pairs from selection
source_parts = menus.select_disk_parts('Clone', state.source)
if state.source.path.samefile(source_parts[0].path):
# Whole disk (or single partition via args), skip settings
bp_dest = state.destination.path
state.add_block_pair(state.source, bp_dest)
return source_parts
# New run, use new settings file
settings['Needs Format'] = True
offset = 0
user_choice = cli.choice(
'Format clone using GPT, MBR, or match Source type?',
['G', 'M', 'S'],
)
if user_choice == 'G':
settings['Table Type'] = 'GPT'
elif user_choice == 'M':
settings['Table Type'] = 'MBR'
else:
# Match source type
settings['Table Type'] = get_table_type(state.source.path)
if cli.ask('Create an empty Windows boot partition on the clone?'):
settings['Create Boot Partition'] = True
offset = 2 if settings['Table Type'] == 'GPT' else 1
# Add pairs
for dest_num, part in enumerate(source_parts):
dest_num += offset + 1
bp_dest = pathlib.Path(
f'{state.destination.path}{dest_sep}{dest_num}',
)
state.add_block_pair(part, bp_dest)
# Add to settings file
source_num = re.sub(r'^.*?(\d+)$', r'\1', part.path.name)
settings['Partition Mapping'].append([source_num, dest_num])
# Save settings
state.save_settings(settings)
# Done
return source_parts
def add_image_block_pairs(state) -> list[hw_disk.Disk]:
"""Add device to image file block pairs."""
source_parts = menus.select_disk_parts(state.mode, state.source)
for part in source_parts:
state.add_block_pair(part, state.destination)
# Done
return source_parts
def build_block_pair_report(block_pairs, settings) -> list:
"""Build block pair report, returns list."""
report = []
notes = []
if block_pairs:
report.append(ansi.color_string('Block Pairs', 'GREEN'))
else:
# Bail early
return report
# Show block pair mapping
if settings and settings['Create Boot Partition']:
if settings['Table Type'] == 'GPT':
report.append(f'{" —— ":<9} --> EFI System Partition')
report.append(f'{" —— ":<9} --> Microsoft Reserved Partition')
elif settings['Table Type'] == 'MBR':
report.append(f'{" —— ":<9} --> System Reserved')
for pair in block_pairs:
report.append(f'{pair.source.name:<9} --> {pair.destination.name}')
# Show resume messages as necessary
if settings:
if not settings['First Run']:
notes.append(
ansi.color_string(
['NOTE:', 'Clone settings loaded from previous run.'],
['BLUE', None],
),
)
if settings['Needs Format'] and settings['Table Type']:
msg = f'Destination will be formatted using {settings["Table Type"]}'
notes.append(
ansi.color_string(
['NOTE:', msg],
['BLUE', None],
),
)
if any(pair.get_rescued_size() > 0 for pair in block_pairs):
notes.append(
ansi.color_string(
['NOTE:', 'Resume data loaded from map file(s).'],
['BLUE', None],
),
)
# Add notes to report
if notes:
report.append(' ')
report.extend(notes)
# Done
return report
def build_sfdisk_partition_line(table_type, dev_path, size, details) -> str:
"""Build sfdisk partition line using passed details, returns str."""
line = f'{dev_path} : size={size}'
dest_type = ''
source_filesystem = str(details.get('fstype', '')).upper()
source_table_type = ''
source_type = details.get('parttype', '')
# Set dest type
if re.match(r'^0x\w+$', source_type):
# Source is a MBR type
source_table_type = 'MBR'
if table_type == 'MBR':
dest_type = source_type.replace('0x', '').lower()
elif re.match(r'^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$', source_type):
# Source is a GPT type
source_table_type = 'GPT'
if table_type == 'GPT':
dest_type = source_type.upper()
if not dest_type:
# Assuming changing table types, set based on FS
if source_filesystem in cfg.ddrescue.PARTITION_TYPES.get(table_type, {}):
dest_type = cfg.ddrescue.PARTITION_TYPES[table_type][source_filesystem]
line += f', type={dest_type}'
# Safety Check
if not dest_type:
cli.print_error(f'Failed to determine partition type for: {dev_path}')
raise std.GenericAbort()
# Add extra details
if details.get('partlabel', ''):
line += f', name="{details["partlabel"]}"'
if details.get('partuuid', '') and source_table_type == table_type:
# Only add UUID if source/dest table types match
line += f', uuid={details["partuuid"].upper()}'
# Done
return line
def get_partition_separator(name) -> str:
"""Get partition separator based on device name, returns str."""
separator = ''
if re.search(r'(loop|mmc|nvme)', name, re.IGNORECASE):
separator = 'p'
return separator
def get_table_type(disk_path) -> str:
"""Get disk partition table type, returns str.
NOTE: If resulting table type is not GPT or MBR
then an exception is raised.
"""
disk_path = str(disk_path)
table_type = None
# Linux
if std.PLATFORM == 'Linux':
cmd = f'lsblk --json --output=pttype --nodeps {disk_path}'.split()
json_data = exe.get_json_from_command(cmd)
table_type = json_data['blockdevices'][0].get('pttype', '').upper()
table_type = table_type.replace('DOS', 'MBR')
# macOS
if std.PLATFORM == 'Darwin':
cmd = ['diskutil', 'list', '-plist', disk_path]
proc = exe.run_program(cmd, check=False, encoding=None, errors=None)
try:
plist_data = plistlib.loads(proc.stdout)
except (TypeError, ValueError):
# Invalid / corrupt plist data? return empty dict to avoid crash
pass
else:
disk_details = plist_data.get('AllDisksAndPartitions', [{}])[0]
table_type = disk_details['Content']
table_type = table_type.replace('FDisk_partition_scheme', 'MBR')
table_type = table_type.replace('GUID_partition_scheme', 'GPT')
# Check type
if table_type not in ('GPT', 'MBR'):
cli.print_error(f'Unsupported partition table type: {table_type}')
raise std.GenericAbort()
# Done
return table_type
def prep_destination(
state,
source_parts: list[hw_disk.Disk],
dry_run: bool = True,
) -> None:
"""Prep destination as necessary."""
# TODO: Split into Linux and macOS
# logical sector size is not easily found under macOS
# It might be easier to rewrite this section using macOS tools
dest_prefix = str(state.destination.path)
dest_prefix += get_partition_separator(state.destination.path.name)
esp_type = 'C12A7328-F81F-11D2-BA4B-00A0C93EC93B'
msr_type = 'E3C9E316-0B5C-4DB8-817D-F92DF00215AE'
part_num = 0
sfdisk_script = []
settings = state.load_settings()
# Bail early
if not settings['Needs Format']:
return
# Add partition table settings
if settings['Table Type'] == 'GPT':
sfdisk_script.append('label: gpt')
else:
sfdisk_script.append('label: dos')
sfdisk_script.append('unit: sectors')
sfdisk_script.append('')
# Add boot partition if requested
if settings['Create Boot Partition']:
if settings['Table Type'] == 'GPT':
part_num += 1
sfdisk_script.append(
build_sfdisk_partition_line(
table_type='GPT',
dev_path=f'{dest_prefix}{part_num}',
size='260MiB',
details={'parttype': esp_type, 'partlabel': 'EFI System'},
),
)
part_num += 1
sfdisk_script.append(
build_sfdisk_partition_line(
table_type=settings['Table Type'],
dev_path=f'{dest_prefix}{part_num}',
size='16MiB',
details={'parttype': msr_type, 'partlabel': 'Microsoft Reserved'},
),
)
elif settings['Table Type'] == 'MBR':
part_num += 1
sfdisk_script.append(
build_sfdisk_partition_line(
table_type='MBR',
dev_path=f'{dest_prefix}{part_num}',
size='100MiB',
details={'parttype': '0x7', 'partlabel': 'System Reserved'},
),
)
# Add selected partition(s)
for part in source_parts:
num_sectors = part.size / state.destination.log_sec
num_sectors = math.ceil(num_sectors)
part_num += 1
sfdisk_script.append(
build_sfdisk_partition_line(
table_type=settings['Table Type'],
dev_path=f'{dest_prefix}{part_num}',
size=num_sectors,
details=part.raw_details,
),
)
# Save sfdisk script
script_path = (
f'{state.working_dir}/'
f'sfdisk_{state.destination.path.name}.script'
)
with open(script_path, 'w', encoding='utf-8') as _f:
_f.write('\n'.join(sfdisk_script))
# Skip real format for dry runs
if dry_run:
LOG.info('Dry run, refusing to format destination')
return
# Format disk
LOG.warning('Formatting destination: %s', state.destination.path)
with open(script_path, 'r', encoding='utf-8') as _f:
proc = exe.run_program(
cmd=['sudo', 'sfdisk', state.destination.path],
stdin=_f,
check=False,
)
if proc.returncode != 0:
cli.print_error('Error(s) encoundtered while formatting destination')
raise std.GenericAbort()
# Update settings
settings['Needs Format'] = False
state.save_settings(settings)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -0,0 +1,745 @@
"""WizardKit: ddrescue TUI"""
# vim: sts=2 sw=2 ts=2
import argparse
import atexit
import datetime
import logging
import os
import pathlib
import subprocess
from random import randint
import pytz
from wk import cfg, exe, io, log, std
from wk.cfg.ddrescue import DDRESCUE_SPECIFIC_PASS_SETTINGS
from wk.clone import menus
from wk.clone.state import State, mark_non_recovered_as_non_tried
from wk.hw import disk as hw_disk
from wk.hw.smart import (
check_attributes,
smart_status_ok,
update_smart_details,
)
from wk.ui import ansi, cli
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
DETECT_DRIVES_NOTICE = '''
This option will force the drive controllers to rescan for devices.
The method used is not 100% reliable and may cause issues. If you see
any script errors or crashes after running this option then please
restart the computer and try again.
'''
DDRESCUE_OUTPUT_HEIGHT = 14
INITIAL_SKIP_MIN = 64 * 1024 # This is ddrescue's minimum accepted value
PLATFORM = std.PLATFORM
TIMEZONE = pytz.timezone(cfg.main.LINUX_TIME_ZONE)
# Functions
def argparse_helper() -> dict[str, None|bool|str]:
"""Helper function to setup and return args, returns dict.
NOTE: A dict is used to match the legacy code.
"""
parser = argparse.ArgumentParser(
prog='ddrescue-tui',
description=f'{cfg.main.KIT_NAME_FULL}: ddrescue TUI',
)
parser.add_argument('mode', choices=('clone', 'image'), nargs='?')
parser.add_argument('source', nargs='?')
parser.add_argument('destination', nargs='?')
parser.add_argument(
'-s', '--dry-run', action='store_true',
help='Print commands to be used instead of running them',
)
parser.add_argument(
'--force-local-map', action='store_true',
help='Skip mounting shares and save map to local drive',
)
parser.add_argument(
'--start-fresh', action='store_true',
help='Ignore previous runs and start new recovery',
)
args = parser.parse_args()
legacy_args = {
'clone': args.mode == 'clone',
'image': args.mode == 'image',
'<source>': args.source,
'<destination>': args.destination,
'--dry-run': args.dry_run,
'--force-local-map': args.force_local_map,
'--start-fresh': args.start_fresh,
}
return legacy_args
def build_ddrescue_cmd(block_pair, pass_name, settings_menu) -> list[str]:
"""Build ddrescue cmd using passed details, returns list."""
cmd = ['sudo', 'ddrescue']
if (block_pair.destination.is_block_device()
or block_pair.destination.is_char_device()):
cmd.append('--force')
cmd.extend(DDRESCUE_SPECIFIC_PASS_SETTINGS.get(pass_name, []))
# Fix domain size based on starting position
domain_size = block_pair.size
if settings_menu.options['--input-position']['Selected']:
settings_menu.options['--reverse']['Selected'] = False
input_position = std.string_to_bytes(
settings_menu.options['--input-position']['Value'],
)
domain_size -= input_position
cmd.append(f'--size={domain_size}')
# Determine skip sizes
if settings_menu.options['--skip-size']['Selected']:
skip_sizes = settings_menu.options['--skip-size']['Value'].split(',')
skip_sizes = [float(s) for s in skip_sizes]
initial_skip = max(INITIAL_SKIP_MIN, int(block_pair.size * skip_sizes[0]))
max_skip = min(int(block_pair.size * skip_sizes[1]), domain_size)
max_skip = max(INITIAL_SKIP_MIN, max_skip)
cmd.append(f'--skip-size={initial_skip},{max_skip}')
cmd.extend(get_ddrescue_settings(settings_menu))
# Add source physical sector size (if possible)
cmd.append(f'--sector-size={block_pair.sector_size}')
# Generate test map if needed
if '--test-mode' in cmd:
cmd.remove('--test-mode')
if not block_pair.test_map:
block_pair.test_map = block_pair.map_path.with_stem(
f'{block_pair.map_path.stem}-testing'
)
generate_test_map(map_path=block_pair.test_map, size=domain_size)
cmd.append(f'--test-mode={block_pair.test_map}')
# Add block pair and map file
if PLATFORM == 'Darwin':
# Use Raw disks if possible
for dev in (block_pair.source, block_pair.destination):
raw_dev = pathlib.Path(dev.with_name(f'r{dev.name}'))
if raw_dev.exists():
cmd.append(raw_dev)
else:
cmd.append(dev)
else:
cmd.append(block_pair.source)
cmd.append(block_pair.destination)
cmd.append(block_pair.map_path)
# Done
LOG.debug('ddrescue cmd: %s', cmd)
return cmd
def check_destination_health(destination) -> str:
"""Check destination health, returns str."""
result = ''
# Bail early
if not isinstance(destination, hw_disk.Disk):
# Return empty string
return result
# Check for critical errors
if not smart_status_ok(destination):
result = 'Critical error(s) detected for: {destination.path}'
# Check for minor errors
if not check_attributes(destination, only_blocking=False):
result = f'Attribute error(s) detected for: {destination.path}'
# Done
return result
def generate_test_map(map_path: pathlib.Path, size: int) -> None:
"""Generate test map with roughly 20% of the space marked as bad."""
chunk = 2*1024**2
output = [
'# Mapfile. Created by WizardKit',
'0x0 ? 1',
]
position = 0
# Generate "holes"
steps, remainder = divmod(size, chunk)
for _ in range(steps):
bad = randint(1, 5) % 5 == 0
output.append(f'{hex(position)} {hex(chunk)} {"-" if bad else "+"}')
position += chunk
if remainder:
output.append(f'{hex(position)} {hex(remainder)} +')
# Save map
map_path.write_text('\n'.join(output), encoding='utf-8')
def get_ddrescue_settings(settings_menu) -> list:
"""Get ddrescue settings from menu selections, returns list."""
settings = []
# Check menu selections
for name, details in settings_menu.options.items():
if name == '--skip-size':
continue
if details['Selected']:
if 'Value' in details:
settings.append(f'{name}={details["Value"]}')
else:
settings.append(name)
# Done
return settings
def finalize_recovery(state: State, dry_run: bool = True) -> None:
"""Show recovery finalization options and run selected functions."""
options = (
'Relocate Backup GPT',
'Zero-fill Gaps',
'Zero-fill Extra Space',
)
# Get destination size
dest_size = -1
if hasattr(state.destination, 'size'):
# hw_disk.Disk
dest_size = state.destination.size
if hasattr(state.destination, 'stat'):
# pathlib.Path
dest_size = state.destination.stat().st_size
# Run checks to disable item(s)
whole_disk = bool(
len(state.block_pairs) == 1
and not state.source.parent
)
disable_gpt_option = not bool(
## Breakdown of below tests:
## Only offer this option when cloning a whole, non-child device
## where the source is using a GUID_Partition_Table
## and the source is smaller than the destination
whole_disk
and str(state.source.raw_details.get('pttype', 'Unknown')).lower() == 'gpt'
and state.source.size < dest_size
)
# Build menu
menu = cli.Menu(title=ansi.color_string('ddrescue TUI: Finalization', 'GREEN'))
menu.separator = ' '
menu.add_action('Start')
menu.add_action('Quit')
for name in options:
details = {'Selected': True}
if 'GPT' in name and disable_gpt_option:
details['Disabled'] = True
details['Selected'] = False
if state.mode == 'Image':
details['Disabled'] = True
details['Selected'] = False
menu.add_option(name, details)
# Show menu
selection = menu.advanced_select()
if 'Quit' in selection:
return
# Run functions
if menu.options['Zero-fill Gaps']['Selected']:
zero_fill_gaps(
state,
dest_size=dest_size,
dry_run=dry_run,
extend_to_end=menu.options['Zero-fill Extra Space']['Selected'],
)
if menu.options['Relocate Backup GPT']['Selected']:
# NOTE: This needs to be run last to avoid corrupting/erasing the backup GPT
relocate_backup_gpt(state, dry_run=dry_run)
def is_missing_source_or_destination(state) -> bool:
"""Check if source or destination dissapeared, returns bool."""
missing = False
items = {
'Source': state.source,
'Destination': state.destination,
}
# Check items
for name, item in items.items():
if not item:
continue
if hasattr(item, 'path'):
if not item.path.exists():
missing = True
cli.print_error(f'{name} disappeared')
elif hasattr(item, 'exists'):
if not item.exists():
missing = True
cli.print_error(f'{name} disappeared')
else:
LOG.error('Unknown %s type: %s', name, item)
# Update top panes
state.update_top_panes()
# Done
return missing
def main() -> None:
"""Main function for ddrescue TUI."""
try:
args = argparse_helper()
except SystemExit:
print('')
cli.pause('Press Enter to exit...')
raise
# Log setup
log_path = log.format_log_path(log_name='main', sub_dir='ddrescue-TUI')
log.update_log_path(
dest_dir=log_path.parent,
dest_name=log_path.stem,
keep_history=False,
timestamp=False,
)
LOG.info('ddrescue-tui Start')
# Check if running inside tmux
if 'TMUX' not in os.environ:
LOG.error('tmux session not found')
raise RuntimeError('tmux session not found')
# Init
state = State(log_dir=log_path.parent)
try:
state.init_recovery(args)
except (FileNotFoundError, std.GenericAbort):
is_missing_source_or_destination(state)
cli.abort()
# Show menu
main_menu = menus.main()
settings_menu = menus.settings(state.mode)
while True:
selection = main_menu.advanced_select()
# Change settings
if 'Change settings' in selection[0]:
while True:
selection = settings_menu.settings_select()
if 'Load Preset' in selection:
# Rebuild settings menu using preset
settings_menu = menus.settings(state.mode, silent=False)
else:
break
# Detect drives
if 'Detect drives' in selection[0]:
cli.clear_screen()
cli.print_warning(DETECT_DRIVES_NOTICE)
if cli.ask('Are you sure you proceed?'):
cli.print_standard('Forcing controllers to rescan for devices...')
cmd = 'echo "- - -" | sudo tee /sys/class/scsi_host/host*/scan'
exe.run_program([cmd], check=False, shell=True)
if source_or_destination_changed(state):
cli.abort()
# Start recovery
if 'Start' in selection:
cli.clear_screen()
run_recovery(state, main_menu, settings_menu, dry_run=args['--dry-run'])
# Quit
if 'Quit' in selection:
total_percent = state.get_percent_recovered()
# Confirm exit if recovery is less than 100%
if total_percent < 100:
cli.print_warning('Recovery is less than 100%')
if not cli.ask('Are you sure you want to quit?'):
continue
finalize_recovery(state, dry_run=args['--dry-run'])
break
# Save results to log
LOG.info('')
for line in state.generate_report():
LOG.info(' %s', ansi.strip_colors(line))
def relocate_backup_gpt(state: State, dry_run: bool = True) -> None:
"""Relocate backup GPT on the destination if applicable and approved."""
cmd = ['sudo', 'sfdisk', '--relocate', 'gpt-bak-std', state.destination.path]
state.destination.update_details(skip_children=False)
# Safety checks
## Breakdown of below tests:
## Only offer this option when cloning a whole, non-child device
## where the source is smaller than the destination
## and both the source and destination are using a GUID_Partition_Table
if not (
len(state.block_pairs) == 1
and str(state.destination.raw_details.get('pttype', 'Unknown')).lower() == 'gpt'
and state.source.size < state.destination.size
and not state.source.parent
and str(state.source.raw_details.get('pttype', 'Unknown')).lower() == 'gpt'
):
LOG.warning('Refusing to attempt a backup GPT relocation.')
return
# Dry run
if dry_run:
cli.print_standard(f'Dry-run: Relocate GPT with command: {cmd}')
return
# Relocate GPT data
proc = exe.run_program(cmd, check=False)
if proc.returncode:
cli.print_error('ERROR: Failed to relocate backup GPT.')
LOG.error('sfdisk result: %s, %s', proc.stdout, proc.stderr)
def run_ddrescue(state, block_pair, pass_name, settings, dry_run=True) -> None:
"""Run ddrescue using passed settings."""
cmd = build_ddrescue_cmd(block_pair, pass_name, settings)
poweroff_source_after_idle = True
state.update_progress_pane('Active')
state.ui.clear_current_pane()
state.ui.clear_on_resize = True
warning_message = ''
def _poweroff_source_drive(idle_minutes) -> None:
"""Power off source drive after a while."""
source_dev = state.source.path
# Bail early
if PLATFORM == 'Darwin':
return
# Sleep
for i in range(1, idle_minutes*60, 1):
if not poweroff_source_after_idle:
# Countdown canceled, exit without powering-down drives
return
if i % 60 == 0:
cli.print_warning(
f'Powering off source in {int((idle_minutes*60-i)/60)} minutes...',
)
std.sleep(1)
# Power off drive
cmd = ['sudo', 'hdparm', '-Y', source_dev]
proc = exe.run_program(cmd, check=False)
if proc.returncode:
cli.print_error(f'Failed to poweroff source {source_dev}')
else:
cli.print_warning(f'Powered off source {source_dev}')
cli.print_standard(
'Press Enter to return to main menu...', end='', flush=True,
)
def _update_smart_panes() -> None:
"""Update SMART panes every 30 seconds."""
now = datetime.datetime.now(tz=TIMEZONE).strftime('%Y-%m-%d %H:%M %Z')
for dev_str in ('source', 'destination'):
dev = getattr(state, dev_str)
# Safety check
if not hasattr(dev, 'attributes'):
continue
# Update SMART data
out_path = f'{state.log_dir}/smart_{dev_str}.out'
update_smart_details(dev)
with open(out_path, 'w', encoding='utf-8') as _f:
_f.write(
ansi.color_string(
['SMART Attributes', f'Updated: {now}\n'],
['BLUE', 'YELLOW'],
sep='\t\t',
),
)
_f.write('\n'.join(dev.generate_report(header=False)))
# Dry run
if dry_run:
LOG.info('ddrescue cmd: %s', cmd)
return
# Start ddrescue and ddrescueview (if enabled)
proc = exe.popen_program(cmd)
if (
block_pair.view_map
and (not block_pair.view_proc or block_pair.view_proc.poll() is not None)
):
block_pair.view_proc = exe.popen_program(
['ddrescueview', '-r', '5s', block_pair.map_path],
pipe=True,
)
# ddrescue loop
_i = 0
while True:
if _i % 30 == 0:
# Update SMART pane
_update_smart_panes()
# Check destination
warning_message = check_destination_health(state.destination)
if warning_message:
# Error detected on destination, stop recovery
proc.terminate()
cli.print_error(warning_message)
break
_i += 1
# Update progress
block_pair.update_progress(pass_name)
state.update_progress_pane('Active')
# Check if complete
try:
proc.wait(timeout=1)
break
except KeyboardInterrupt:
# Wait a bit to let ddrescue exit safely
LOG.warning('ddrescue stopped by user')
warning_message = 'Aborted'
std.sleep(2)
proc.terminate()
break
except subprocess.TimeoutExpired:
# Continue to next loop to update panes
pass
else:
# Done
std.sleep(1)
break
# Update progress
# NOTE: Using 'Active' here to avoid flickering between block pairs
block_pair.update_progress(pass_name)
state.update_progress_pane('Active')
state.ui.clear_on_resize = False
# Check result
if proc.poll():
# True if return code is non-zero (poll() returns None if still running)
poweroff_thread = exe.start_thread(
_poweroff_source_drive,
[cfg.ddrescue.DRIVE_POWEROFF_TIMEOUT],
)
warning_message = 'Error(s) encountered, see message above'
state.update_top_panes()
if warning_message:
cli.print_standard(' ')
cli.print_standard(' ')
cli.print_error('DDRESCUE PROCESS HALTED')
cli.print_standard(' ')
cli.print_warning(warning_message)
# Needs attention?
if str(proc.poll()) != '0':
state.update_progress_pane('NEEDS ATTENTION')
cli.pause('Press Enter to return to main menu...')
# Stop source poweroff countdown
cli.print_standard('Stopping device poweroff countdown...', flush=True)
poweroff_source_after_idle = False
poweroff_thread.join() # type: ignore[reportUnboundVariable]
# Done
raise std.GenericAbort()
def run_recovery(state: State, main_menu, settings_menu, dry_run=True) -> None:
"""Run recovery passes."""
atexit.register(state.save_debug_reports)
attempted_recovery = False
auto_continue = False
# Bail early
if is_missing_source_or_destination(state):
cli.print_standard('')
cli.pause('Press Enter to return to main menu...')
return
if source_or_destination_changed(state):
cli.print_standard('')
cli.abort()
# Get settings
for name, details in main_menu.toggles.items():
if 'Auto continue' in name and details['Selected']:
auto_continue = True
if 'Retry' in name and details['Selected']:
details['Selected'] = False
state.retry_all_passes()
# Start SMART/Journal
state.ui.add_info_pane(
percent=50,
update_layout=False,
watch_file=f'{state.log_dir}/smart_source.out',
)
if hasattr(state.destination, 'attributes'):
state.ui.add_info_pane(
percent=50,
update_layout=False,
watch_file=f'{state.log_dir}/smart_destination.out',
)
if PLATFORM == 'Linux':
state.ui.add_worker_pane(lines=4, cmd='journal-datarec-monitor')
state.ui.set_current_pane_height(DDRESCUE_OUTPUT_HEIGHT)
# Run pass(es)
for pass_name in ('read-skip', 'read-full', 'trim', 'scrape'):
abort = False
# Skip to next pass
if state.pass_complete(pass_name):
# NOTE: This bypasses auto_continue
state.skip_pass(pass_name)
continue
# Run ddrescue
for pair in state.block_pairs:
if not pair.pass_complete(pass_name):
attempted_recovery = True
state.mark_started()
try:
run_ddrescue(state, pair, pass_name, settings_menu, dry_run=dry_run)
except (FileNotFoundError, KeyboardInterrupt, std.GenericAbort):
is_missing_source_or_destination(state)
abort = True
break
# Continue or return to menu
all_complete = state.pass_complete(pass_name)
all_above_threshold = state.pass_above_threshold(pass_name)
if abort or not (all_complete and all_above_threshold and auto_continue):
LOG.warning('Recovery halted')
break
# Stop SMART/Journal
state.ui.remove_all_info_panes()
state.ui.remove_all_worker_panes()
state.ui.clear_current_pane_height()
# Show warning if nothing was done
if not attempted_recovery:
cli.print_warning('No actions performed')
cli.print_standard(' ')
cli.pause('Press Enter to return to main menu...')
# Done
state.save_debug_reports()
atexit.unregister(state.save_debug_reports)
state.update_progress_pane('Idle')
def source_or_destination_changed(state) -> bool:
"""Verify the source and destination objects are still valid."""
changed = False
# Compare objects
for obj in (state.source, state.destination):
if not obj:
changed = True
elif hasattr(obj, 'exists'):
# Assuming dest path
changed = changed or not obj.exists()
elif isinstance(obj, hw_disk.Disk):
compare_dev = hw_disk.Disk(obj.path)
for key in ('model', 'serial'):
changed = changed or getattr(obj, key) != getattr(compare_dev, key)
# Update top panes
state.update_top_panes()
# Done
if changed:
cli.print_error('Source and/or Destination changed')
return changed
def zero_fill_gaps(
state: State,
dest_size: int,
dry_run: bool = True,
extend_to_end: bool = False,
) -> None:
"""Zero-fill any gaps on the destination."""
#fake_settings_menu = menus.settings(state.mode)
full_disk_clone = bool(
state.mode == 'Clone'
and len(state.block_pairs) == 1
and state.source.path == state.block_pairs[0].source
)
larger_destination = state.source.size < dest_size
percent_recovered = state.get_percent_recovered()
# Bail early
if percent_recovered == 100 and not (larger_destination and extend_to_end):
return
for block_pair in state.block_pairs:
domain_size = block_pair.size
if (full_disk_clone and state.source.size < state.destination.size):
domain_size = dest_size
larger_destination = True
# Prep zero-fill map file
zero_map_path = block_pair.map_path.with_stem(
f'{block_pair.map_path.stem}_zero-fill',
)
io.copy_file(block_pair.map_path, zero_map_path, overwrite=True)
mark_non_recovered_as_non_tried(zero_map_path)
if full_disk_clone and larger_destination and extend_to_end:
# Extend domain size
with open(zero_map_path, 'a', encoding='utf-8') as f:
f.write(
f'\n{hex(block_pair.size)} '
f'{hex(domain_size - block_pair.size)} ?'
)
# Build cmd
cmd = [
'sudo',
'ddrescue',
'--force',
f'--size={domain_size}',
'--binary-prefixes',
'--complete-only',
'--data-preview=5',
'--odirect',
'--retry-passes=0',
f'--sector-size={block_pair.sector_size}',
'-vvvv',
'/dev/zero',
block_pair.destination,
zero_map_path,
]
# Dry run
if dry_run:
cli.print_standard(f'Zero-fill with command: {cmd}')
return
# Re-run ddrescue to zero-fill gaps
proc = exe.run_program(cmd, check=False, pipe=False)
if proc.returncode:
cli.print_error('ERROR: Failed to zero-fill: {block_pair.destination}')
LOG.error('zero-fill error: %s, %s', proc.stdout, proc.stderr)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

109
scripts/wk/clone/image.py Normal file
View file

@ -0,0 +1,109 @@
"""WizardKit: ddrescue TUI - State"""
# vim: sts=2 sw=2 ts=2
import atexit
import logging
import pathlib
import plistlib
import re
from wk import exe
from wk.std import PLATFORM
from wk.ui import cli
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
# Functions
def mount_raw_image(path) -> pathlib.Path:
"""Mount raw image using OS specific methods, returns pathlib.Path."""
loopback_path = None
if PLATFORM == 'Darwin':
loopback_path = mount_raw_image_macos(path)
elif PLATFORM == 'Linux':
loopback_path = mount_raw_image_linux(path)
# Check
if not loopback_path:
cli.print_error(f'Failed to mount image: {path}')
# Register unmount atexit
atexit.register(unmount_loopback_device, loopback_path)
# Done
return loopback_path
def mount_raw_image_linux(path) -> pathlib.Path:
"""Mount raw image using losetup, returns pathlib.Path."""
loopback_path = None
# Mount using losetup
cmd = [
'sudo',
'losetup',
'--find',
'--partscan',
'--show',
path,
]
proc = exe.run_program(cmd, check=False)
# Check result
if proc.returncode == 0:
loopback_path = proc.stdout.strip()
# Done
return loopback_path
def mount_raw_image_macos(path) -> pathlib.Path:
"""Mount raw image using hdiutil, returns pathlib.Path."""
loopback_path = None
plist_data = {}
# Mount using hdiutil
# plistdata['system-entities'][{}...]
cmd = [
'hdiutil', 'attach',
'-imagekey', 'diskimage-class=CRawDiskImage',
'-nomount',
'-plist',
'-readonly',
path,
]
proc = exe.run_program(cmd, check=False, encoding=None, errors=None)
# Check result
try:
plist_data = plistlib.loads(proc.stdout)
except plistlib.InvalidFileException:
return None
for dev in plist_data.get('system-entities', []):
dev_path = dev.get('dev-entry', '')
if re.match(r'^/dev/disk\d+$', dev_path):
loopback_path = dev_path
# Done
return loopback_path
def unmount_loopback_device(path) -> None:
"""Unmount loopback device using OS specific methods."""
cmd = []
# Build OS specific cmd
if PLATFORM == 'Darwin':
cmd = ['hdiutil', 'detach', path]
elif PLATFORM == 'Linux':
cmd = ['sudo', 'losetup', '--detach', path]
# Unmount loopback device
exe.run_program(cmd, check=False)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

273
scripts/wk/clone/menus.py Normal file
View file

@ -0,0 +1,273 @@
"""WizardKit: ddrescue TUI - Menus"""
# vim: sts=2 sw=2 ts=2
import logging
import pathlib
from wk.cfg.ddrescue import DDRESCUE_SETTINGS
from wk.hw.disk import Disk, get_disks
from wk.std import GenericAbort, PLATFORM, bytes_to_string
from wk.ui import ansi, cli
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
CLONE_SETTINGS = {
'Source': None,
'Destination': None,
'Create Boot Partition': False,
'First Run': True,
'Needs Format': False,
'Table Type': None,
'Partition Mapping': [
# (5, 1) ## Clone source partition #5 to destination partition #1
],
}
if PLATFORM == 'Darwin':
# TODO: Direct I/O needs more testing under macOS
DDRESCUE_SETTINGS['Default']['--idirect'] = {'Selected': False, 'Hidden': True}
DDRESCUE_SETTINGS['Default']['--odirect'] = {'Selected': False, 'Hidden': True}
MENU_ACTIONS = (
'Start',
f'Change settings {ansi.color_string("(experts only)", "YELLOW")}',
f'Detect drives {ansi.color_string("(experts only)", "YELLOW")}',
'Quit')
MENU_TOGGLES = {
'Auto continue (if recovery % over threshold)': True,
'Retry (mark non-rescued sectors "non-tried")': False,
}
SETTING_PRESETS = (
'Default',
'Fast',
'Safe',
)
# Functions
def main() -> cli.Menu:
"""Main menu, returns wk.ui.cli.Menu."""
menu = cli.Menu(title=ansi.color_string('ddrescue TUI: Main Menu', 'GREEN'))
menu.separator = ' '
# Add actions, options, etc
for action in MENU_ACTIONS:
if not (PLATFORM == 'Darwin' and 'Detect drives' in action):
menu.add_action(action)
for toggle, selected in MENU_TOGGLES.items():
menu.add_toggle(toggle, {'Selected': selected})
# Done
return menu
def settings(mode: str, silent: bool = True) -> cli.Menu:
"""Settings menu, returns wk.ui.cli.Menu."""
title_text = [
ansi.color_string('ddrescue TUI: Expert Settings', 'GREEN'),
' ',
ansi.color_string(
['These settings can cause', 'MAJOR DAMAGE', 'to drives'],
['YELLOW', 'RED', 'YELLOW'],
),
'Please read the manual before making changes',
]
menu = cli.Menu(title='\n'.join(title_text))
menu.separator = ' '
preset = 'Default'
if not silent:
# Ask which preset to use
cli.print_standard(
f'Available ddrescue presets: {" / ".join(SETTING_PRESETS)}'
)
preset = cli.choice('Please select a preset:', SETTING_PRESETS)
# Fix selection
for _p in SETTING_PRESETS:
if _p.startswith(preset):
preset = _p
# Add default settings
menu.add_action('Load Preset')
menu.add_action('Main Menu')
for name, details in DDRESCUE_SETTINGS['Default'].items():
menu.add_option(name, details.copy())
# Update settings using preset
if preset != 'Default':
for name, details in DDRESCUE_SETTINGS[preset].items():
menu.options[name].update(details.copy())
# Disable direct output when saving to an image
if mode == 'Image':
menu.options['--odirect']['Disabled'] = True
menu.options['--odirect']['Selected'] = False
# Done
return menu
def disks() -> cli.Menu:
"""Disk menu, returns wk.ui.cli.Menu()."""
cli.print_info('Scanning disks...')
available_disks = get_disks()
menu = cli.Menu('ddrescue TUI: Disk selection')
menu.disabled_str = 'Already selected'
menu.separator = ' '
menu.add_action('Quit')
for disk in available_disks:
menu.add_option(
name=(
f'{str(disk.path):<12} '
f'{disk.bus:<5} '
f'{bytes_to_string(disk.size, decimals=1, use_binary=False):<8} '
f'{disk.model} '
f'{disk.serial}'
),
details={'Object': disk},
)
# Done
return menu
def select_disk(prompt_msg: str, menu: cli.Menu) -> Disk:
"""Select disk from provided Menu, returns Disk()."""
menu.title = ansi.color_string(
f'ddrescue TUI: {prompt_msg} Selection', 'GREEN',
)
# Get selection
selection = menu.simple_select()
if 'Quit' in selection:
raise GenericAbort()
# Disable selected disk's menu entry
menu.options[selection[0]]['Disabled'] = True
# Update details to include child devices
selected_disk = selection[-1]['Object']
selected_disk.update_details(skip_children=False)
# Done
return selected_disk
def select_disk_parts(prompt_msg, disk) -> list[Disk]:
"""Select disk parts from list, returns list of Disk()."""
title = ansi.color_string('ddrescue TUI: Partition Selection', 'GREEN')
title += f'\n\nDisk: {disk.path} {disk.description}'
menu = cli.Menu(title)
menu.separator = ' '
menu.add_action('All')
menu.add_action('None')
menu.add_action('Proceed', {'Separator': True})
menu.add_action('Quit')
object_list = []
def _select_parts(menu) -> None:
"""Loop over selection menu until at least one partition selected."""
while True:
selection = menu.advanced_select(
f'Please select the parts to {prompt_msg.lower()}: ',
)
if 'All' in selection:
for option in menu.options.values():
option['Selected'] = True
elif 'None' in selection:
for option in menu.options.values():
option['Selected'] = False
elif 'Proceed' in selection:
if any(option['Selected'] for option in menu.options.values()):
# At least one partition/device selected/device selected
break
elif 'Quit' in selection:
raise GenericAbort()
# Bail early if running under macOS
if PLATFORM == 'Darwin':
return [disk]
# Bail early if child device selected
if disk.parent:
return [disk]
# Add parts
whole_disk_str = f'{str(disk.path):<14} (Whole device)'
for part in disk.children:
fstype = part.get('fstype', '')
fstype = str(fstype) if fstype else ''
size = part["size"]
name = (
f'{str(part["path"]):<14} '
f'{fstype.upper():<5} '
f'({bytes_to_string(size, decimals=1, use_binary=True):>6})'
)
menu.add_option(name, details={'Selected': True, 'pathlib.Path': part['path']})
# Add whole disk if necessary
if not menu.options:
menu.add_option(whole_disk_str, {'Selected': True, 'pathlib.Path': disk.path})
menu.title += '\n\n'
menu.title += ansi.color_string(' No partitions detected.', 'YELLOW')
# Get selection
_select_parts(menu)
# Build list of Disk() object_list
for option in menu.options.values():
if option['Selected']:
object_list.append(option['pathlib.Path'])
# Check if whole disk selected
if len(object_list) == len(disk.children):
# NOTE: This is not true if the disk has no partitions
msg = f'Preserve partition table and unused space in {prompt_msg.lower()}?'
if cli.ask(msg):
# Replace part list with whole disk obj
object_list = [disk.path]
# Convert object_list to Disk() objects
cli.print_standard(' ')
cli.print_info('Getting disk/partition details...')
object_list = [Disk(path) for path in object_list]
# Done
return object_list
def select_path(prompt_msg) -> pathlib.Path:
"""Select path, returns pathlib.Path."""
invalid = False
menu = cli.Menu(
title=ansi.color_string(f'ddrescue TUI: {prompt_msg} Path Selection', 'GREEN'),
)
menu.separator = ' '
menu.add_action('Quit')
menu.add_option('Current directory')
menu.add_option('Enter manually')
path = pathlib.Path.cwd()
# Make selection
selection = menu.simple_select()
if 'Current directory' in selection:
pass
elif 'Enter manually' in selection:
path = pathlib.Path(cli.input_text('Please enter path: '))
elif 'Quit' in selection:
raise GenericAbort()
# Check
try:
path = path.resolve()
except TypeError:
invalid = True
if invalid or not path.is_dir():
cli.print_error(f'Invalid path: {path}')
raise GenericAbort()
# Done
return path
if __name__ == '__main__':
print("This file is not meant to be called directly.")

1068
scripts/wk/clone/state.py Normal file

File diff suppressed because it is too large Load diff

189
scripts/wk/debug.py Normal file
View file

@ -0,0 +1,189 @@
"""WizardKit: Debug Functions"""
# vim: sts=2 sw=2 ts=2
import inspect
import logging
import lzma
import os
import pathlib
import pickle
import platform
import re
import socket
import sys
import time
from typing import Any
import requests
from wk.cfg.net import CRASH_SERVER
from wk.log import get_root_logger_path
# Classes
class Debug():
"""Object used when dumping debug data."""
def method(self) -> None:
"""Dummy method used to identify functions vs data."""
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
DEBUG_CLASS = Debug()
METHOD_TYPE = type(DEBUG_CLASS.method)
# Functions
def generate_debug_report() -> str:
"""Generate debug report, returns str."""
platform_function_list = (
'architecture',
'machine',
'platform',
'python_version',
)
report = []
# Logging data
try:
log_path = get_root_logger_path()
except RuntimeError:
# Assuming logging wasn't started
pass
else:
report.append('------ Start Log -------')
report.append('')
with open(log_path, 'r', encoding='utf-8') as log_file:
report.extend(log_file.read().splitlines())
report.append('')
report.append('------- End Log --------')
# System
report.append('--- Start debug info ---')
report.append('')
report.append('[System]')
report.append(f' {"FQDN":<24} {socket.getfqdn()}')
for func in platform_function_list:
func_name = func.replace('_', ' ').capitalize()
func_result = getattr(platform, func)()
report.append(f' {func_name:<24} {func_result}')
report.append(f' {"Python sys.argv":<24} {sys.argv}')
report.append('')
# Environment
report.append('[Environment Variables]')
for key, value in sorted(os.environ.items()):
report.append(f' {key:<24} {value}')
report.append('')
# Done
report.append('---- End debug info ----')
return '\n'.join(report)
def generate_object_report(obj: Any, indent: int = 0) -> list[str]:
"""Generate debug report for obj, returns list."""
report = []
attr_list = []
# Get attribute list
if hasattr(obj, '__slots__'):
attr_list = list(obj.__slots__)
else:
attr_list = [name for name in dir(obj) if not name.startswith('_')]
# Dump object data
for name in attr_list:
attr = getattr(obj, name)
# Skip methods
if isinstance(attr, METHOD_TYPE):
continue
# Add attribute to report (expanded if necessary)
if isinstance(attr, dict):
report.append(f'{name}:')
for key, value in attr.items():
report.append(f'{" "*(indent+1)}{key}: {str(value)}')
else:
report.append(f'{" "*indent}{name}: {str(attr)}')
# Done
return report
def save_pickles(
obj_dict: dict[Any, Any],
out_path: pathlib.Path | str | None = None,
) -> None:
"""Save dict of objects using pickle."""
LOG.info('Saving pickles')
# Set path
if not out_path:
out_path = get_root_logger_path()
out_path = out_path.parent.joinpath('../debug').resolve()
# Save pickles
try:
for name, obj in obj_dict.copy().items():
if name.startswith('__') or inspect.ismodule(obj):
continue
with open(f'{out_path}/{name}.pickle', 'wb') as _f:
pickle.dump(obj, _f, protocol=pickle.HIGHEST_PROTOCOL)
except Exception:
LOG.error('Failed to save all the pickles', exc_info=True)
def upload_debug_report(
report: str,
compress: bool = True,
reason: str = 'DEBUG',
) -> None:
"""Upload debug report to CRASH_SERVER as specified in wk.cfg.main."""
LOG.info('Uploading debug report to %s', CRASH_SERVER.get('Name', '?'))
headers = CRASH_SERVER.get('Headers', {'X-Requested-With': 'XMLHttpRequest'})
if compress:
headers['Content-Type'] = 'application/octet-stream'
# Check if the required server details are available
if not all(CRASH_SERVER.get(key, False) for key in ('Name', 'Url', 'User')):
msg = 'Server details missing, aborting upload.'
print(msg)
raise RuntimeError(msg)
# Set filename (based on the logging config if possible)
filename = 'Unknown'
try:
log_path = get_root_logger_path()
except RuntimeError:
# Assuming logging wasn't started
pass
else:
# Strip everything but the prefix
filename = re.sub(r'^(.*)_(\d{4}-\d{2}-\d{2}.*)', r'\1', log_path.name)
filename = f'{filename}_{reason}_{time.strftime("%Y-%m-%d_%H%M%S%z")}.log'
LOG.debug('filename: %s', filename)
# Compress report
if compress:
filename += '.xz'
xz_report = lzma.compress(report.encode('utf8'))
# Upload report
url = f'{CRASH_SERVER["Url"]}/{filename}'
response = requests.put(
url,
auth=(CRASH_SERVER['User'], CRASH_SERVER.get('Pass', '')),
data=xz_report if compress else report,
headers=headers,
timeout=60,
)
# Check response
if not response.ok:
raise RuntimeError('Failed to upload report')
if __name__ == '__main__':
print("This file is not meant to be called directly.")

325
scripts/wk/exe.py Normal file
View file

@ -0,0 +1,325 @@
"""WizardKit: Execution functions"""
# vim: sts=2 sw=2 ts=2
import json
import logging
import os
import pathlib
import re
import subprocess
import time
from io import IOBase
from queue import Queue, Empty
from threading import Thread
from typing import Any, Callable, Iterable
import psutil
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
# 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: IOBase):
self.stream: IOBase = stream
self.queue: Queue = Queue()
def populate_queue(stream: IOBase, queue: Queue) -> None:
"""Collect lines from stream and put them in queue."""
while not stream.closed:
try:
line = stream.read(1)
except ValueError:
# Assuming the stream was closed
line = None
if line:
queue.put(line)
self.thread = start_thread(
populate_queue,
args=(self.stream, self.queue),
)
def stop(self) -> None:
"""Stop reading from input stream."""
self.stream.close()
def read(self, timeout: float | int | None = None) -> Any:
"""Read from queue if possible, returns item from queue."""
try:
return self.queue.get(block=timeout is not None, timeout=timeout)
except Empty:
return None
def save_to_file(self, proc: subprocess.Popen, out_path: pathlib.Path | str) -> None:
"""Continuously save output to file while proc is running."""
LOG.debug('Saving process %s output to %s', proc, out_path)
while proc.poll() is None:
out = b''
out_bytes = b''
while out is not None:
out = self.read(0.1)
if out:
out_bytes += out
with open(out_path, 'a', encoding='utf-8') as _f:
_f.write(out_bytes.decode('utf-8', errors='ignore'))
# Close stream to prevent 100% CPU usage
self.stream.close()
# Functions
def build_cmd_kwargs(
cmd: list[str],
minimized: bool = False,
pipe: bool = True,
shell: bool = False,
**kwargs) -> dict[str, Any]:
"""Build kwargs for use by subprocess functions, returns dict.
Specifically subprocess.run() and subprocess.Popen().
NOTE: If no encoding specified then UTF-8 will be used.
"""
LOG.debug(
'cmd: %s, minimized: %s, pipe: %s, shell: %s, kwargs: %s',
cmd, minimized, pipe, shell, kwargs,
)
cmd_kwargs = {
'args': cmd,
'shell': shell,
}
# Strip sudo if appropriate
if cmd[0] == 'sudo':
if os.name == 'posix' and os.geteuid() == 0:
cmd.pop(0)
# Add additional kwargs if applicable
for key in 'check cwd encoding errors stderr stdin stdout'.split():
if key in kwargs:
cmd_kwargs[key] = kwargs[key]
# Default to UTF-8 encoding
if not ('encoding' in cmd_kwargs or 'errors' in cmd_kwargs):
cmd_kwargs['encoding'] = 'utf-8'
cmd_kwargs['errors'] = 'ignore'
# Start minimized
if minimized:
startupinfo = subprocess.STARTUPINFO() # type: ignore
startupinfo.dwFlags = subprocess.STARTF_USESHOWWINDOW # type: ignore
startupinfo.wShowWindow = 6
cmd_kwargs['startupinfo'] = startupinfo
# Pipe output
if pipe:
cmd_kwargs['stderr'] = subprocess.PIPE
cmd_kwargs['stdout'] = subprocess.PIPE
# Done
LOG.debug('cmd_kwargs: %s', cmd_kwargs)
return cmd_kwargs
def get_json_from_command(
cmd: list[str],
check: bool = True,
encoding: str = 'utf-8',
errors: str = 'ignore',
) -> dict[Any, Any]:
"""Capture JSON content from cmd output, returns dict.
If the data can't be decoded then either an exception is raised
or an empty dict is returned depending on errors.
"""
LOG.debug('Loading JSON data from cmd: %s', cmd)
json_data = {}
try:
proc = run_program(cmd, check=check, encoding=encoding, errors=errors)
json_data = json.loads(proc.stdout)
except (subprocess.CalledProcessError, json.decoder.JSONDecodeError):
if errors != 'ignore':
raise
return json_data
def get_procs(
name: str,
exact: bool = True,
try_again: bool = True,
) -> list[psutil.Process]:
"""Get process object(s) based on name, returns list of proc objects."""
LOG.debug('name: %s, exact: %s', name, exact)
processes = []
regex = f'^{name}$' if exact else name
# Iterate over all processes
for proc in psutil.process_iter():
if re.search(regex, proc.name(), re.IGNORECASE):
processes.append(proc)
# Try again?
if not processes and try_again:
time.sleep(1)
processes = get_procs(name, exact, try_again=False)
# Done
return processes
def kill_procs(
name: str,
exact: bool = True,
force: bool = False,
timeout: float | int = 30,
) -> None:
"""Kill all processes matching name (case-insensitively).
NOTE: Under Posix systems this will send SIGINT to allow processes
to gracefully exit.
If force is True then it will wait until timeout specified and then
send SIGKILL to any processes still alive.
"""
LOG.debug(
'name: %s, exact: %s, force: %s, timeout: %s',
name, exact, force, timeout,
)
target_procs = get_procs(name, exact=exact)
for proc in target_procs:
proc.terminate()
# Force kill if necesary
if force:
results = psutil.wait_procs(target_procs, timeout=timeout)
for proc in results[1]: # Alive processes
proc.kill()
def popen_program(
cmd: list[str],
minimized: bool = False,
pipe: bool = False,
shell: bool = False,
**kwargs,
) -> subprocess.Popen:
"""Run program and return a subprocess.Popen object."""
LOG.debug(
'cmd: %s, minimized: %s, pipe: %s, shell: %s',
cmd, minimized, pipe, shell,
)
LOG.debug('kwargs: %s', kwargs)
cmd_kwargs = build_cmd_kwargs(
cmd,
minimized=minimized,
pipe=pipe,
shell=shell,
**kwargs)
try:
proc = subprocess.Popen(**cmd_kwargs)
except FileNotFoundError:
LOG.error('Command not found: %s', cmd)
raise
LOG.debug('proc: %s', proc)
# Done
return proc
def run_program(
cmd: list[str],
check: bool = True,
pipe: bool = True,
shell: bool = False,
**kwargs,
) -> subprocess.CompletedProcess:
"""Run program and return a subprocess.CompletedProcess object."""
LOG.debug(
'cmd: %s, check: %s, pipe: %s, shell: %s',
cmd, check, pipe, shell,
)
LOG.debug('kwargs: %s', kwargs)
cmd_kwargs = build_cmd_kwargs(
cmd,
check=check,
pipe=pipe,
shell=shell,
**kwargs)
check = cmd_kwargs.pop('check', True) # Avoids linting warning
try:
proc = subprocess.run(check=check, **cmd_kwargs)
except FileNotFoundError:
LOG.error('Command not found: %s', cmd)
raise
LOG.debug('proc: %s', proc)
# Done
return proc
def start_thread(
function: Callable,
args: Iterable[Any] | None = None,
daemon: bool = True,
) -> Thread:
"""Run function as thread in background, returns Thread object."""
LOG.debug(
'Starting background thread for function: %s, args: %s, daemon: %s',
function, args, daemon,
)
args = args if args else []
thread = Thread(target=function, args=args, daemon=daemon)
thread.start()
return thread
def stop_process(proc: subprocess.Popen, graceful: bool = True) -> None:
"""Stop process.
NOTES: proc should be a subprocess.Popen obj.
If graceful is True then a SIGTERM is sent before SIGKILL.
"""
# Graceful exit
if graceful:
if os.name == 'posix' and os.geteuid() != 0:
run_program(['sudo', 'kill', str(proc.pid)], check=False)
else:
proc.terminate()
time.sleep(2)
# Force exit
if os.name == 'posix' and os.geteuid() != 0:
run_program(['sudo', 'kill', '-9', str(proc.pid)], check=False)
else:
proc.kill()
def wait_for_procs(
name: str,
exact: bool = True,
timeout: float | int | None = None,
) -> None:
"""Wait for all process matching name."""
LOG.debug('name: %s, exact: %s, timeout: %s', name, exact, timeout)
target_procs = get_procs(name, exact=exact)
procs = psutil.wait_procs(target_procs, timeout=timeout)
# Raise exception if necessary
if procs[1]: # Alive processes
raise psutil.TimeoutExpired(name=name, seconds=timeout)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

156
scripts/wk/graph.py Normal file
View file

@ -0,0 +1,156 @@
"""WizardKit: Graph Functions"""
# vim: sts=2 sw=2 ts=2
import logging
from wk.ui import ansi
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
GRAPH_HORIZONTAL = ('', '', '', '', '', '', '', '')
GRAPH_VERTICAL = (
'', '', '', '',
'', '', '', '',
'█▏', '█▎', '█▍', '█▌',
'█▋', '█▊', '█▉', '██',
'██▏', '██▎', '██▍', '██▌',
'██▋', '██▊', '██▉', '███',
'███▏', '███▎', '███▍', '███▌',
'███▋', '███▊', '███▉', '████',
)
# SCALE_STEPS: These scales allow showing differences between HDDs and SSDs
# on the same graph.
SCALE_STEPS = {
8: [2**(0.56*(x+1))+(16*(x+1)) for x in range(8)],
16: [2**(0.56*(x+1))+(16*(x+1)) for x in range(16)],
32: [2**(0.56*(x+1)/2)+(16*(x+1)/2) for x in range(32)],
}
# THRESHOLDS: These are the rate_list (in MB/s) used to color graphs
THRESH_FAIL = 65 * 1024**2
THRESH_WARN = 135 * 1024**2
THRESH_GREAT = 750 * 1024**2
# Functions
def generate_horizontal_graph(
rate_list: list[float],
graph_width: int = 40,
oneline: bool = False) -> list[str]:
"""Generate horizontal graph from rate_list, returns list."""
graph = ['', '', '', '']
scale = 8 if oneline else 32
# Build graph
for rate in merge_rates(rate_list, graph_width=graph_width):
step = get_graph_step(rate, scale=scale)
# Set color
rate_color = None
if rate < THRESH_FAIL:
rate_color = 'RED'
elif rate < THRESH_WARN:
rate_color = 'YELLOW'
elif rate > THRESH_GREAT:
rate_color = 'GREEN'
# Build graph
full_block = ansi.color_string((GRAPH_HORIZONTAL[-1],), (rate_color,))
if step >= 24:
graph[0] += ansi.color_string((GRAPH_HORIZONTAL[step-24],), (rate_color,))
graph[1] += full_block
graph[2] += full_block
graph[3] += full_block
elif step >= 16:
graph[0] += ' '
graph[1] += ansi.color_string((GRAPH_HORIZONTAL[step-16],), (rate_color,))
graph[2] += full_block
graph[3] += full_block
elif step >= 8:
graph[0] += ' '
graph[1] += ' '
graph[2] += ansi.color_string((GRAPH_HORIZONTAL[step-8],), (rate_color,))
graph[3] += full_block
else:
graph[0] += ' '
graph[1] += ' '
graph[2] += ' '
graph[3] += ansi.color_string((GRAPH_HORIZONTAL[step],), (rate_color,))
# Done
if oneline:
graph = graph[-1:]
return graph
def get_graph_step(rate: float, scale: int = 16) -> int:
"""Get graph step based on rate and scale, returns int."""
rate_in_mb = rate / (1024**2)
step = 0
# Iterate over scale_steps backwards
for _r in range(scale-1, -1, -1):
if rate_in_mb >= SCALE_STEPS[scale][_r]:
step = _r
break
# Done
return step
def merge_rates(
rates: list[float],
graph_width: int = 40,
) -> list[int | float]:
"""Merge rates to have entries equal to the width, returns list."""
merged_rates = []
offset = 0
slice_width = int(len(rates) / graph_width)
# Merge rates
for _ in range(graph_width):
merged_rates.append(sum(rates[offset:offset+slice_width])/slice_width)
offset += slice_width
# Done
return merged_rates
def vertical_graph_line(percent: float, rate: float, scale: int = 32) -> str:
"""Build colored graph string using thresholds, returns str."""
color_bar = None
color_rate = None
step = get_graph_step(rate, scale=scale)
# Set colors
if rate < THRESH_FAIL:
color_bar = 'RED'
color_rate = 'YELLOW'
elif rate < THRESH_WARN:
color_bar = 'YELLOW'
color_rate = 'YELLOW'
elif rate > THRESH_GREAT:
color_bar = 'GREEN'
color_rate = 'GREEN'
# Build string
line = ansi.color_string(
strings=(
f'{percent:5.1f}%',
f'{GRAPH_VERTICAL[step]:<4}',
f'{rate/(1000**2):6.1f} MB/s',
),
colors=(
None,
color_bar,
color_rate,
),
sep=' ',
)
# Done
return line
if __name__ == '__main__':
print("This file is not meant to be called directly.")

15
scripts/wk/hw/__init__.py Normal file
View file

@ -0,0 +1,15 @@
"""WizardKit: hw module init"""
from . import audio
from . import benchmark
from . import cpu
from . import diags
from . import disk
from . import keyboard
from . import network
from . import screensavers
from . import sensors
from . import smart
from . import surface_scan
from . import system
from . import test

37
scripts/wk/hw/audio.py Normal file
View file

@ -0,0 +1,37 @@
"""WizardKit: Audio test functions"""
# vim: sts=2 sw=2 ts=2
import logging
from wk.exe import run_program
from wk.std import PLATFORM
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
# Functions
def audio_test() -> None:
"""Run an OS-specific audio test."""
if PLATFORM == 'Linux':
audio_test_linux()
def audio_test_linux() -> None:
"""Run an audio test using amixer and speaker-test."""
LOG.info('Audio Test')
# Set volume
for source in ('Master', 'PCM'):
cmd = f'amixer -q set "{source}" 80% unmute'.split()
run_program(cmd, check=False)
# Run audio tests
for mode in ('pink', 'wav'):
cmd = f'speaker-test -c 2 -l 1 -t {mode}'.split()
run_program(cmd, check=False, pipe=False)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

219
scripts/wk/hw/benchmark.py Normal file
View file

@ -0,0 +1,219 @@
"""WizardKit: Benchmark test functions"""
# vim: sts=2 sw=2 ts=2
import logging
from subprocess import PIPE, STDOUT
from wk import graph
from wk.cfg.hw import (
IO_ALT_TEST_SIZE_FACTOR,
IO_BLOCK_SIZE,
IO_CHUNK_SIZE,
IO_GRAPH_WIDTH,
IO_MINIMUM_TEST_SIZE,
IO_RATE_REGEX,
THRESH_HDD_AVG_HIGH,
THRESH_HDD_AVG_LOW,
THRESH_HDD_MIN,
THRESH_SSD_AVG_HIGH,
THRESH_SSD_AVG_LOW,
THRESH_SSD_MIN,
)
from wk.exe import run_program
from wk.std import PLATFORM
from wk.ui import ansi
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
# Error Classes
class DeviceTooSmallError(RuntimeError):
"""Raised when a device is too small to test."""
# Functions
def calc_io_dd_values(dev_size, test_mode=False) -> dict[str, int]:
"""Calculate I/O benchmark dd values, returns dict.
Calculations:
The minimum dev size is IO_GRAPH_WIDTH * IO_CHUNK_SIZE
(e.g. 1.25 GB for a width of 40 and a chunk size of 32MB)
read_total is the area to be read in bytes
If the dev is < IO_MINIMUM_TEST_SIZE then it's the whole dev
Else it's the larger of IO_MINIMUM_TEST_SIZE or the alt test size
(determined by dev * IO_ALT_TEST_SIZE_FACTOR)
read_chunks is the number of groups of IO_CHUNK_SIZE in test_obj.dev
This number is reduced to a multiple of IO_GRAPH_WIDTH in order
to allow for the data to be condensed cleanly
read_blocks is the chunk size in number of blocks
(e.g. 64 if block size is 512KB and chunk size is 32MB
skip_total is the number of IO_BLOCK_SIZE groups not tested
skip_blocks is the number of blocks to skip per IO_CHUNK_SIZE
skip_extra_rate is how often to add an additional skip block
This is needed to ensure an even testing across the dev
This is calculated by using the fractional amount left off
of the skip_blocks variable
test_mode limits the benchmark to IO_MINIMUM_TEST_SIZE (if possible)
"""
if test_mode and dev_size > IO_MINIMUM_TEST_SIZE:
dev_size = IO_MINIMUM_TEST_SIZE
read_total = min(IO_MINIMUM_TEST_SIZE, dev_size)
read_total = max(read_total, dev_size*IO_ALT_TEST_SIZE_FACTOR)
read_chunks = int(read_total // IO_CHUNK_SIZE)
read_chunks -= read_chunks % IO_GRAPH_WIDTH
if read_chunks < IO_GRAPH_WIDTH:
raise DeviceTooSmallError
read_blocks = int(IO_CHUNK_SIZE / IO_BLOCK_SIZE)
read_total = read_chunks * IO_CHUNK_SIZE
skip_total = int((dev_size - read_total) // IO_BLOCK_SIZE)
skip_blocks = int((skip_total / read_chunks) // 1)
skip_extra_rate = 0
try:
skip_extra_rate = 1 + int(1 / ((skip_total / read_chunks) % 1))
except ZeroDivisionError:
# skip_extra_rate == 0 is fine
pass
# Test mode
if test_mode:
read_chunks_limit = int(read_chunks * 0.1)
read_chunks_limit = (read_chunks_limit // IO_GRAPH_WIDTH) * IO_GRAPH_WIDTH
read_chunks = max(IO_GRAPH_WIDTH, read_chunks_limit)
# Done
return {
'Read Chunks': read_chunks,
'Read Blocks': read_blocks,
'Skip Blocks': skip_blocks,
'Skip Extra': skip_extra_rate,
}
def check_io_results(test_obj, rate_list, graph_width) -> None:
"""Check I/O restuls and generate report using rate_list."""
avg_read = sum(rate_list) / len(rate_list)
min_read = min(rate_list)
max_read = max(rate_list)
if test_obj.dev.ssd:
thresh_min = THRESH_SSD_MIN
thresh_avg_high = THRESH_SSD_AVG_HIGH
thresh_avg_low = THRESH_SSD_AVG_LOW
else:
thresh_min = THRESH_HDD_MIN
thresh_avg_high = THRESH_HDD_AVG_HIGH
thresh_avg_low = THRESH_HDD_AVG_LOW
# Add horizontal graph to report
for line in graph.generate_horizontal_graph(rate_list, graph_width):
if not ansi.strip_colors(line).strip():
# Skip empty lines
continue
test_obj.report.append(line)
# Add read rates to report
test_obj.report.append(
f'Read speeds avg: {avg_read/(1000**2):3.1f}'
f' min: {min_read/(1000**2):3.1f}'
f' max: {max_read/(1000**2):3.1f}'
)
# Compare against thresholds
if min_read <= thresh_min and avg_read <= thresh_avg_high:
test_obj.failed = True
elif avg_read <= thresh_avg_low:
test_obj.failed = True
else:
test_obj.passed = True
# Set status
if test_obj.failed:
test_obj.set_status('Failed')
elif test_obj.passed:
test_obj.set_status('Passed')
else:
test_obj.set_status('Unknown')
def run_io_test(test_obj, log_path, test_mode=False) -> None:
"""Run I/O benchmark and handle exceptions."""
dev_path = test_obj.dev.path
if PLATFORM == 'Darwin':
# Use "RAW" disks under macOS
dev_path = dev_path.with_name(f'r{dev_path.name}')
LOG.info('Using %s for better performance', dev_path)
offset = 0
read_rates = []
test_obj.report.append(ansi.color_string('I/O Benchmark', 'BLUE'))
# Get dd values or bail
try:
dd_values = calc_io_dd_values(test_obj.dev.size, test_mode=test_mode)
except DeviceTooSmallError:
test_obj.set_status('N/A')
test_obj.report.append(
ansi.color_string('Disk too small to test', 'YELLOW'),
)
return
# Run dd read tests
for _i in range(dd_values['Read Chunks']):
_i += 1
# Build cmd
skip = dd_values['Skip Blocks']
if dd_values['Skip Extra'] and _i % dd_values['Skip Extra'] == 0:
skip += 1
cmd = [
'sudo', 'dd',
f'bs={IO_BLOCK_SIZE}',
f'skip={offset+skip}',
f'count={dd_values["Read Blocks"]}',
f'if={dev_path}',
'of=/dev/null',
]
if PLATFORM == 'Linux':
cmd.append('iflag=direct')
# Run and get read rate
try:
proc = run_program(
cmd,
pipe=False,
stdout=PIPE,
stderr=STDOUT,
)
except PermissionError as err:
# Since we're using sudo we can't kill dd
# Assuming this happened during a CTRL+c
raise KeyboardInterrupt from err
match = IO_RATE_REGEX.search(proc.stdout)
if match:
read_rates.append(
int(match.group('bytes')) / float(match.group('seconds')),
)
match.group(1)
# Show progress
with open(log_path, 'a', encoding='utf-8') as _f:
if _i % 5 == 0:
percent = (_i / dd_values['Read Chunks']) * 100
_f.write(f' {graph.vertical_graph_line(percent, read_rates[-1])}\n')
# Update offset
offset += dd_values['Read Blocks'] + skip
# Check results
check_io_results(test_obj, read_rates, IO_GRAPH_WIDTH)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

237
scripts/wk/hw/cpu.py Normal file
View file

@ -0,0 +1,237 @@
"""WizardKit: CPU test functions"""
# vim: sts=2 sw=2 ts=2
import logging
import re
import subprocess
from typing import TextIO
from wk import exe
from wk.cfg.hw import CPU_TEMPS
from wk.os.mac import set_fans as macos_set_fans
from wk.std import PLATFORM
from wk.ui import ansi
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
SysbenchType = tuple[subprocess.Popen, TextIO]
# Functions
def check_cooling_results(sensors, test_object) -> None:
"""Check cooling result via sensor data."""
idle_temp = sensors.get_cpu_temp('Idle')
cooldown_temp = sensors.get_cpu_temp('Cooldown')
max_temp = sensors.get_cpu_temp('Max')
test_object.report.append(ansi.color_string('Temps', 'BLUE'))
# Check temps
if max_temp > CPU_TEMPS['Critical']:
test_object.failed = True
test_object.set_status('Failed')
test_object.report.extend([
ansi.color_string(
f' WARNING: Critical CPU temp of {CPU_TEMPS["Critical"]} exceeded.',
'RED',
),
'',
])
elif idle_temp >= CPU_TEMPS['Idle High']:
test_object.failed = True
test_object.set_status('Failed')
test_object.report.extend([
ansi.color_string(
f' WARNING: Max idle temp of {CPU_TEMPS["Idle High"]} exceeded.',
'YELLOW',
),
'',
])
elif (
cooldown_temp <= CPU_TEMPS['Cooling Low Cutoff']
or max_temp - cooldown_temp >= CPU_TEMPS['Cooling Delta']
):
test_object.passed = True
test_object.set_status('Passed')
else:
test_object.passed = False
test_object.set_status('Unknown')
if cooldown_temp - idle_temp >= CPU_TEMPS['Idle Delta']:
test_object.report.extend([
ansi.color_string(
f' WARNING: Cooldown temp at least {CPU_TEMPS["Idle Delta"]}° over idle.',
'YELLOW',
),
'',
])
# Build report
report_labels = ['Idle']
average_labels = []
if 'Sysbench' in sensors.temp_labels:
average_labels.append('Sysbench')
report_labels.extend(['Sysbench', 'Cooldown'])
if 'Prime95' in sensors.temp_labels:
average_labels.append('Prime95')
report_labels.append('Prime95')
if 'Cooldown' not in report_labels:
report_labels.append('Cooldown')
if len(sensors.temp_labels.intersection(['Prime95', 'Sysbench'])) < 1:
# Include overall max temp if needed
report_labels.append('Max')
for line in sensors.generate_report(
*report_labels, only_cpu=True, include_avg_for=average_labels):
test_object.report.append(f' {line}')
def check_mprime_results(test_obj, working_dir) -> None:
"""Check mprime log files and update test_obj."""
passing_lines = set()
warning_lines = set()
def _read_file(log_name) -> list[str]:
"""Read file and split into lines, returns list."""
lines = []
try:
with open(f'{working_dir}/{log_name}', 'r', encoding='utf-8') as _f:
lines = _f.readlines()
except FileNotFoundError:
# File may be missing on older systems
lines = []
return lines
# results.txt (check if failed)
for line in _read_file('results.txt'):
line = line.strip()
if re.search(r'(error|fail)', line, re.IGNORECASE):
warning_lines.add(line)
# prime.log (check if passed)
for line in _read_file('prime.log'):
line = line.strip()
match = re.search(
r'(completed.*(\d+) errors, (\d+) warnings)', line, re.IGNORECASE)
if match:
if int(match.group(2)) + int(match.group(3)) > 0:
# Errors and/or warnings encountered
warning_lines.add(match.group(1).capitalize())
else:
# No errors/warnings
passing_lines.add(match.group(1).capitalize())
# Update status
if warning_lines:
test_obj.failed = True
test_obj.set_status('Failed')
elif passing_lines and 'Aborted' not in test_obj.status:
test_obj.passed = True
test_obj.set_status('Passed')
else:
test_obj.set_status('Unknown')
# Update report
for line in passing_lines:
test_obj.report.append(f' {line}')
for line in warning_lines:
test_obj.report.append(ansi.color_string(f' {line}', 'YELLOW'))
if not (passing_lines or warning_lines):
test_obj.report.append(ansi.color_string(' Unknown result', 'YELLOW'))
def start_mprime(working_dir, log_path) -> subprocess.Popen:
"""Start mprime and save filtered output to log, returns Popen object."""
set_apple_fan_speed('max')
proc_mprime = subprocess.Popen(
['mprime', '-t'],
cwd=working_dir,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
proc_grep = subprocess.Popen(
'grep --ignore-case --invert-match --line-buffered stress.txt'.split(),
stdin=proc_mprime.stdout,
stdout=subprocess.PIPE,
)
proc_mprime.stdout.close() # type: ignore[reportOptionalMemberAccess]
save_nbsr = exe.NonBlockingStreamReader(
proc_grep.stdout, # type: ignore[reportGeneralTypeIssues]
)
exe.start_thread(
save_nbsr.save_to_file,
args=(proc_grep, log_path),
)
# Return objects
return proc_mprime
def set_apple_fan_speed(speed) -> None:
"""Set Apple fan speed."""
cmd = None
# Check
if speed not in ('auto', 'max'):
raise RuntimeError(f'Invalid speed {speed}')
# Set cmd
if PLATFORM == 'Darwin':
try:
macos_set_fans(speed)
except (RuntimeError, ValueError, subprocess.CalledProcessError) as err:
LOG.error('Failed to set fans to %s', speed)
LOG.error('Error: %s', err)
#ui.print_error(f'Failed to set fans to {speed}')
#for line in str(err).splitlines():
# ui.print_warning(f' {line.strip()}')
elif PLATFORM == 'Linux':
cmd = ['apple-fans', speed]
exe.run_program(cmd, check=False)
def start_sysbench(log_path) -> SysbenchType:
"""Start sysbench, returns tuple with Popen object and file handle."""
set_apple_fan_speed('max')
cmd = [
'sysbench',
f'--threads={exe.psutil.cpu_count()}',
'--cpu-max-prime=1000000000',
'cpu',
'run',
]
# Start sysbench
filehandle = open(
log_path, 'a', encoding='utf-8',
)
proc = exe.popen_program(cmd, stdout=filehandle)
# Done
return (proc, filehandle)
def stop_mprime(proc_mprime) -> None:
"""Stop mprime gracefully, then forcefully as needed."""
proc_mprime.terminate()
try:
proc_mprime.wait(timeout=5)
except subprocess.TimeoutExpired:
proc_mprime.kill()
set_apple_fan_speed('auto')
def stop_sysbench(proc_sysbench, filehandle_sysbench) -> None:
"""Stop sysbench."""
proc_sysbench.terminate()
try:
proc_sysbench.wait(timeout=5)
except subprocess.TimeoutExpired:
proc_sysbench.kill()
filehandle_sysbench.flush()
filehandle_sysbench.close()
set_apple_fan_speed('auto')
if __name__ == '__main__':
print("This file is not meant to be called directly.")

983
scripts/wk/hw/diags.py Normal file
View file

@ -0,0 +1,983 @@
"""WizardKit: Hardware diagnostics"""
# vim: sts=2 sw=2 ts=2
import argparse
import atexit
import logging
import os
import pathlib
import subprocess
from wk import cfg, debug, exe, log, std
from wk.cfg.hw import STATUS_COLORS
from wk.hw import benchmark as hw_benchmark
from wk.hw import cpu as hw_cpu
from wk.hw import disk as hw_disk
from wk.hw import sensors as hw_sensors
from wk.hw import smart as hw_smart
from wk.hw import surface_scan as hw_surface_scan
from wk.hw import system as hw_system
from wk.hw.audio import audio_test
from wk.hw.keyboard import keyboard_test
from wk.hw.network import network_test
from wk.hw.screensavers import screensaver
from wk.hw.test import Test, TestGroup
from wk.ui import ansi, cli, tui
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
TEST_GROUPS = {
# Also used to build the menu options
## NOTE: This needs to be above MENU_SETS
'CPU (Sysbench)': 'cpu_test_sysbench',
'CPU (Prime95)': 'cpu_test_mprime',
'CPU (Cooling)': 'cpu_test_cooling',
'Disk Attributes': 'disk_attribute_check',
'Disk Self-Test': 'disk_self_test',
'Disk Surface Scan': 'disk_surface_scan',
'Disk I/O Benchmark': 'disk_io_benchmark',
}
MENU_ACTIONS = (
'Audio Test',
'Keyboard Test',
'Network Test',
'Clock Sync',
'Start',
'Quit')
MENU_ACTIONS_SECRET = (
'Matrix',
'Tubes',
)
MENU_OPTIONS_QUICK = ('Disk Attributes',)
MENU_SETS = {
'Full Diagnostic': (*TEST_GROUPS,),
'CPU Diagnostic': (*[group for group in TEST_GROUPS if group.startswith('CPU')],),
'Disk Diagnostic': (
'Disk Attributes',
'Disk Self-Test',
'Disk Surface Scan',
'Disk I/O Benchmark',
),
'Disk Diagnostic (Quick)': ('Disk Attributes',),
}
MENU_TOGGLES = (
'Skip USB Benchmarks',
)
PLATFORM = std.PLATFORM
# Classes
class State():
"""Object for tracking hardware diagnostic data."""
def __init__(self, test_mode=False):
self.disks: list[hw_disk.Disk] = []
self.log_dir: pathlib.Path | None = None
self.progress_file: pathlib.Path | None = None
self.sensors: hw_sensors.Sensors = hw_sensors.Sensors()
self.system: hw_system.System | None = None
self.test_groups: list[TestGroup] = []
self.title_text: str = ansi.color_string('Hardware Diagnostics', 'GREEN')
if test_mode:
self.title_text += ansi.color_string(' (Test Mode)', 'YELLOW')
self.ui: tui.TUI = tui.TUI(f'{self.title_text}\nMain Menu')
def abort_testing(self) -> None:
"""Set unfinished tests as aborted and cleanup panes."""
for group in self.test_groups:
for test in group.test_objects:
if test.status in ('Pending', 'Working'):
test.set_status('Aborted')
# Cleanup panes
self.reset_layout()
def disk_safety_checks(self) -> None:
"""Check for mid-run SMART failures and failed test(s)."""
for dev in self.disks:
disk_smart_status_check(dev, mid_run=True)
for test in dev.tests:
if test.failed:
# Skip acceptable failure states
if 'Attributes' in test.name:
continue
if 'Self-Test' in test.name and 'TimedOut' in test.status:
continue
# Disable remaining tests
dev.disable_disk_tests()
break
def init_diags(self, menu) -> None:
"""Initialize diagnostic pass."""
# Reset objects
self.disks.clear()
self.sensors = hw_sensors.Sensors()
self.test_groups.clear()
# Set log
self.log_dir = log.format_log_path(
log_name='main',
sub_dir='Hardware-Diagnostics',
)
log.update_log_path(
dest_dir=self.log_dir.parent,
dest_name=self.log_dir.stem,
keep_history=False,
timestamp=False,
)
self.log_dir = self.log_dir.parent
cli.clear_screen()
cli.print_info('Initializing...')
# Progress Pane
self.progress_file = pathlib.Path(f'{self.log_dir}/progress.out')
self.update_progress_file()
self.ui.set_progress_file(self.progress_file)
# Add HW Objects
self.system = hw_system.System()
self.disks = hw_disk.get_disks(skip_kits=True)
for disk in self.disks:
hw_smart.enable_smart(disk)
hw_smart.update_smart_details(disk)
# Add test objects
for name, details in menu.options.items():
if not details['Selected']:
# Only add selected options
continue
if 'CPU' in name:
self.system.tests.append(
Test(dev=self.system, label=name[5:-1], name=name),
)
if 'Disk' in name:
test_group = TestGroup(
name=name, function=globals()[TEST_GROUPS[name]],
)
for disk in self.disks:
test_obj = Test(dev=disk, label=disk.path.name, name=name)
disk.tests.append(test_obj)
test_group.test_objects.append(test_obj)
self.test_groups.append(test_group)
# Group CPU tests
if self.system.tests:
self.test_groups.insert(
0,
TestGroup(
name='CPU & Cooling',
function=run_cpu_tests,
test_objects=self.system.tests,
),
)
def reset_layout(self) -> None:
"""Reset layout to avoid flickering."""
self.ui.clear_current_pane_height()
self.ui.remove_all_info_panes()
self.ui.remove_all_worker_panes()
def save_debug_reports(self) -> None:
"""Save debug reports to disk."""
LOG.info('Saving debug reports')
debug_dir = pathlib.Path(f'{self.log_dir}/debug')
if not debug_dir.exists():
debug_dir.mkdir()
# State (self)
debug.save_pickles({'state': self}, debug_dir)
with open(f'{debug_dir}/state.report', 'a', encoding='utf-8') as _f:
_f.write('\n'.join(debug.generate_object_report(self)))
# Disks
for disk in self.disks:
with open(
f'{debug_dir}/disk_{disk.path.name}.report', 'a',
encoding='utf-8') as _f:
_f.write('\n'.join(debug.generate_object_report(disk)))
_f.write('\n\n[Tests]')
for test in disk.tests:
_f.write(f'\n{test.name}:\n')
_f.write('\n'.join(debug.generate_object_report(test, indent=1)))
# SMC
if os.path.exists('/.wk-live-macos'):
data = []
try:
proc = exe.run_program(['smc', '-f'])
data.extend(proc.stdout.splitlines())
data.append('----')
proc = exe.run_program(['smc', '-l'])
data.extend(proc.stdout.splitlines())
except Exception:
LOG.error('Error(s) encountered while exporting SMC data')
data = [line.strip() for line in data]
with open(f'{debug_dir}/smc.data', 'a', encoding='utf-8') as _f:
_f.write('\n'.join(data))
# System
with open(f'{debug_dir}/system.report', 'a', encoding='utf-8') as _f:
_f.write('\n'.join(debug.generate_object_report(self.system)))
_f.write('\n\n[Tests]')
for test in self.system.tests:
_f.write(f'\n{test.name}:\n')
_f.write('\n'.join(debug.generate_object_report(test, indent=1)))
def update_progress_file(self) -> None:
"""Update progress file."""
report = []
for group in self.test_groups:
report.append(ansi.color_string(group.name, 'BLUE'))
for test in group.test_objects:
report.append(ansi.color_string(
[test.label, f'{test.status:>{self.ui.side_width-len(test.label)}}'],
[None, STATUS_COLORS.get(test.status, None)],
sep='',
))
# Add spacer
report.append(' ')
# Write to progress file
self.progress_file.write_text('\n'.join(report), encoding='utf-8')
def update_title_text(self, text) -> None:
"""Update top pane with text."""
self.ui.set_title(self.title_text, text)
# Functions
def argparse_helper() -> dict[str, bool]:
"""Helper function to setup and return args, returns dict.
NOTE: A dict is used to match the legacy code.
"""
parser = argparse.ArgumentParser(
prog='hw-diags',
description=f'{cfg.main.KIT_NAME_FULL}: Hardware Diagnostics',
)
parser.add_argument(
'-c', '--cli', action='store_true',
help='Force CLI mode',
)
parser.add_argument(
'-q', '--quick', action='store_true',
help='Skip menu and perform a quick check',
)
parser.add_argument(
'-t', '--test-mode', action='store_true',
help='Run diags in test mode',
)
args = parser.parse_args()
legacy_args = {
'--cli': args.cli,
'--quick': args.quick,
'--test-mode': args.test_mode,
}
return legacy_args
def build_menu(cli_mode=False, quick_mode=False) -> cli.Menu:
"""Build main menu, returns wk.ui.cli.Menu."""
menu = cli.Menu(title='')
# Add actions, options, etc
for action in MENU_ACTIONS:
menu.add_action(action)
for action in MENU_ACTIONS_SECRET:
menu.add_action(action, {'Hidden': True})
for option in TEST_GROUPS:
menu.add_option(option, {'Selected': True})
for toggle in MENU_TOGGLES:
menu.add_toggle(toggle, {'Selected': True})
for name, targets in MENU_SETS.items():
menu.add_set(name, {'Targets': targets})
menu.actions['Start']['Separator'] = True
# Update default selections for quick mode if necessary
if quick_mode:
for name, details in menu.options.items():
# Only select quick option(s)
details['Selected'] = name in MENU_OPTIONS_QUICK
# Skip CPU tests for TestStations
if os.path.exists(cfg.hw.TESTSTATION_FILE):
menu.options['CPU (Sysbench)']['Selected'] = False
menu.options['CPU (Prime95)']['Selected'] = False
menu.options['CPU (Cooling)']['Selected'] = False
# Add CLI actions if necessary
if cli_mode or 'DISPLAY' not in os.environ:
menu.add_action('Reboot')
menu.add_action('Power Off')
# Compatibility checks
if PLATFORM != 'Linux':
for name in ('Audio Test', 'Keyboard Test'):
menu.actions[name]['Disabled'] = True
if PLATFORM not in ('Darwin', 'Linux'):
for name in ('Matrix', 'Network Test', 'Tubes'):
menu.actions[name]['Disabled'] = True
# Live macOS actions
if os.path.exists('/.wk-live-macos'):
menu.actions['Clock Sync']['Separator'] = True
else:
menu.actions['Clock Sync']['Disabled'] = True
menu.actions['Clock Sync']['Hidden'] = True
# Done
return menu
def cpu_tests_init(state: State) -> None:
"""Initialize CPU tests."""
sensors_out = pathlib.Path(f'{state.log_dir}/sensors.out')
state.update_title_text(state.system.cpu_description)
# Start monitor
if PLATFORM == 'Darwin':
state.ui.add_info_pane(
percent=80, cmd='./hw-sensors', update_layout=False,
)
elif PLATFORM == 'Linux':
state.ui.add_info_pane(
percent=80,
watch_file=pathlib.Path(f'{state.log_dir}/sensors.out'),
update_layout=False,
)
state.sensors.start_background_monitor(sensors_out)
state.ui.set_current_pane_height(3)
# Save idle temps
cli.print_standard('Saving idle temps...')
state.sensors.save_average_temps(temp_label='Idle', seconds=5, save_history=False)
def cpu_tests_end(state: State) -> None:
"""End CPU tests."""
# Cleanup
state.sensors.clear_temps(next_label='Done')
state.sensors.stop_background_monitor()
state.ui.clear_current_pane_height()
state.ui.remove_all_info_panes()
state.ui.remove_all_worker_panes()
def cpu_test_cooling(state: State, test_object, test_mode=False) -> None:
"""CPU cooling test via sensor data assessment."""
_ = test_mode
LOG.info('CPU Test (Cooling)')
# Bail early
if test_object.disabled:
return
hw_cpu.check_cooling_results(state.sensors, test_object)
state.update_progress_file()
def cpu_test_mprime(state: State, test_object, test_mode=False) -> None:
"""CPU stress test using mprime."""
LOG.info('CPU Test (Prime95)')
aborted = False
log_path = pathlib.Path(f'{state.log_dir}/prime.log')
sensors_out = pathlib.Path(f'{state.log_dir}/sensors.out')
test_minutes = cfg.hw.CPU_TEST_MINUTES
if test_mode:
test_minutes = cfg.hw.TEST_MODE_CPU_LIMIT
# Bail early
if test_object.disabled:
return
if state.sensors.cpu_reached_critical_temp():
test_object.set_status('Denied')
test_object.disabled = True
return
# Prep
test_object.set_status('Working')
state.update_progress_file()
state.ui.clear_current_pane()
cli.print_info('Running stress test')
print('')
# Start sensors monitor
state.sensors.clear_temps(next_label='Prime95')
state.sensors.stop_background_monitor()
state.sensors.start_background_monitor(
sensors_out,
alt_max='Prime95',
thermal_action=('killall', '-INT', 'mprime'),
)
# Run Prime95
hw_cpu.set_apple_fan_speed('max')
proc = hw_cpu.start_mprime(state.log_dir, log_path)
state.ui.add_worker_pane(lines=10, watch_cmd='tail', watch_file=log_path)
try:
print_countdown(proc=proc, seconds=test_minutes*60)
except KeyboardInterrupt:
aborted = True
# Stop Prime95
hw_cpu.stop_mprime(proc)
# Get cooldown temp
if 'Cooldown' in state.sensors.temp_labels:
# Give Prime95 time to save the results
std.sleep(1)
state.sensors.clear_temps(next_label='Cooldown')
else:
# Save cooldown temp
state.ui.clear_current_pane()
cli.print_standard('Letting CPU cooldown...')
std.sleep(5)
cli.print_standard('Saving cooldown temps...')
state.sensors.save_average_temps(temp_label='Cooldown', seconds=5)
# Check Prime95 results
test_object.report.append(ansi.color_string('Prime95', 'BLUE'))
hw_cpu.check_mprime_results(test_obj=test_object, working_dir=state.log_dir)
# Update progress
if state.sensors.cpu_reached_critical_temp() or aborted:
test_object.set_status('Aborted')
state.update_progress_file()
# Done
state.ui.remove_all_worker_panes()
if aborted:
cpu_tests_end(state)
raise std.GenericAbort('Aborted')
def cpu_test_sysbench(state: State, test_object, test_mode=False) -> None:
"""CPU stress test using Sysbench."""
LOG.info('CPU Test (Sysbench)')
aborted = False
log_path = pathlib.Path(f'{state.log_dir}/sysbench.log')
sensors_out = pathlib.Path(f'{state.log_dir}/sensors.out')
test_minutes = cfg.hw.CPU_TEST_MINUTES
if test_mode:
test_minutes = cfg.hw.TEST_MODE_CPU_LIMIT
# Bail early
if test_object.disabled:
return
# Prep
test_object.set_status('Working')
state.update_progress_file()
state.ui.clear_current_pane()
cli.print_info('Running stress test')
print('')
# Start sensors monitor
state.sensors.clear_temps(next_label='Sysbench')
state.sensors.stop_background_monitor()
state.sensors.start_background_monitor(
sensors_out,
alt_max='Sysbench',
thermal_action=('killall', '-INT', 'sysbench'),
)
# Run sysbench
state.ui.add_worker_pane(lines=10, watch_cmd='tail', watch_file=log_path)
proc, filehandle = hw_cpu.start_sysbench(log_path=log_path)
try:
print_countdown(proc=proc, seconds=test_minutes*60)
except AttributeError:
# Assuming the sysbench process wasn't found and proc was set to None
LOG.error('Failed to find sysbench process', exc_info=True)
except KeyboardInterrupt:
aborted = True
hw_cpu.stop_sysbench(proc, filehandle)
# Get cooldown temp
if 'Cooldown' in state.sensors.temp_labels:
state.sensors.clear_temps(next_label='Cooldown')
else:
state.ui.clear_current_pane()
cli.print_standard('Letting CPU cooldown...')
std.sleep(5)
cli.print_standard('Saving cooldown temps...')
state.sensors.save_average_temps(temp_label='Cooldown', seconds=5)
# Update progress
test_object.report.append(ansi.color_string('Sysbench', 'BLUE'))
if aborted:
test_object.set_status('Aborted')
test_object.report.append(ansi.color_string(' Aborted.', 'YELLOW'))
state.update_progress_file()
elif state.sensors.cpu_reached_critical_temp():
test_object.set_status('Aborted')
test_object.report.append(
ansi.color_string(' Aborted due to temps.', 'YELLOW'),
)
elif proc.returncode not in (-15, -2, 0):
# NOTE: Return codes:
# 0 == Completed w/out issue
# -2 == Stopped with INT signal
# -15 == Stopped with TERM signal
test_object.set_status('Failed')
test_object.report.append(f' Failed with return code: {proc.returncode}')
else:
test_object.set_status('Passed')
test_object.report.append(' Completed without issue.')
state.update_progress_file()
# Done
state.ui.remove_all_worker_panes()
if aborted:
cpu_tests_end(state)
raise std.GenericAbort('Aborted')
def disk_attribute_check(state: State, test_objects, test_mode=False) -> None:
"""Disk attribute check."""
_ = test_mode
LOG.info('Disk Attribute Check')
for test in test_objects:
disk_smart_status_check(test.dev, mid_run=False)
if not test.dev.attributes:
# No NVMe/SMART data
test.set_status('N/A')
continue
# Done
state.update_progress_file()
def disk_io_benchmark(
state, test_objects, skip_usb=True, test_mode=False) -> None:
"""Disk I/O benchmark using dd."""
LOG.info('Disk I/O Benchmark (dd)')
aborted = False
# Run benchmarks
state.update_title_text(
f'Disk I/O Benchmark{"s" if len(test_objects) > 1 else ""}',
)
state.ui.set_current_pane_height(10)
for test in test_objects:
if test.disabled:
# Skip
continue
# Skip USB devices if requested
if skip_usb and test.dev.bus == 'USB':
test.set_status('Skipped')
continue
# Start benchmark
state.ui.clear_current_pane()
cli.print_report(test.dev.generate_report())
test.set_status('Working')
test_log = f'{state.log_dir}/{test.dev.path.name}_benchmark.out'
state.ui.remove_all_worker_panes()
state.ui.add_worker_pane(
percent=50,
update_layout=False,
watch_cmd='tail',
watch_file=test_log,
)
state.update_progress_file()
try:
hw_benchmark.run_io_test(test, test_log, test_mode=test_mode)
except KeyboardInterrupt:
aborted = True
except (subprocess.CalledProcessError, TypeError, ValueError) as err:
# Something went wrong
LOG.error('%s', err)
test.set_status('ERROR')
test.report.append(ansi.color_string(' Unknown Error', 'RED'))
# Mark test(s) aborted if necessary
if aborted:
test.set_status('Aborted')
test.report.append(ansi.color_string(' Aborted', 'YELLOW'))
break
# Update progress after each test
state.update_progress_file()
# Cleanup
state.update_progress_file()
state.ui.clear_current_pane_height()
state.ui.remove_all_worker_panes()
# Done
if aborted:
raise std.GenericAbort('Aborted')
def disk_self_test(state: State, test_objects, test_mode=False) -> None:
"""Disk self-test if available."""
_ = test_mode
LOG.info('Disk Self-Test(s)')
aborted = False
threads = []
# Run self-tests
state.update_title_text(
f'Disk self-test{"s" if len(test_objects) > 1 else ""}',
)
cli.print_info(f'Starting self-test{"s" if len(test_objects) > 1 else ""}')
show_failed_attributes(state)
for test in reversed(test_objects):
if test.disabled:
# Skip
continue
# Start thread
test.set_status('Working')
test_log = f'{state.log_dir}/{test.dev.path.name}_selftest.log'
threads.append(exe.start_thread(hw_smart.run_self_test, args=(test, test_log)))
# Show progress
if threads[-1].is_alive():
state.ui.add_worker_pane(lines=4, watch_file=test_log)
# Wait for all tests to complete
state.update_progress_file()
try:
while True:
if any(t.is_alive() for t in threads):
std.sleep(1)
else:
break
except KeyboardInterrupt:
aborted = True
for test in test_objects:
hw_smart.abort_self_test(test.dev)
std.sleep(0.5)
hw_smart.build_self_test_report(test, aborted=True)
# Cleanup
state.update_progress_file()
state.ui.remove_all_worker_panes()
# Done
if aborted:
raise std.GenericAbort('Aborted')
def disk_smart_status_check(dev, mid_run=True) -> None:
"""Check SMART status."""
msg = None
color = None
disable_tests = False
# Bail if dev is missing
if not dev.present:
dev.disable_disk_tests()
return
# Check SMART status and attributes
if not hw_smart.smart_status_ok(dev):
msg = 'Critical SMART error detected'
color = 'RED'
disable_tests = True
elif not hw_smart.check_attributes(dev, only_blocking=False):
# Non-blocking errors
msg = 'SMART attribute failure(s) detected'
color = 'YELLOW'
# Log errors if detected
if msg and not dev.contains_note(msg):
msg = f'{msg}{" during diagnostics" if mid_run else ""}'
LOG.warning(msg)
dev.add_note(msg, color)
# Set Disk Attributes test result
for test in dev.tests:
if test.name == 'Disk Attributes':
test.failed = bool(test.failed or msg)
test.passed = not test.failed
if test.failed:
test.set_status('Failed')
elif 'N/A' not in test.status:
test.set_status('Passed')
# Disable further testing if needed
if disable_tests:
dev.disable_disk_tests()
def disk_surface_scan(state: State, test_objects, test_mode=False) -> None:
"""Read-only disk surface scan using badblocks."""
LOG.info('Disk Surface Scan (badblocks)')
aborted = False
threads = []
# Update panes
state.update_title_text(
f'Disk Surface Scan{"s" if len(test_objects) > 1 else ""}',
)
cli.print_info(
f'Starting disk surface scan{"s" if len(test_objects) > 1 else ""}',
)
show_failed_attributes(state)
# Run surface scans
for test in reversed([test for test in test_objects if not test.disabled]):
# Start thread
test_log = f'{state.log_dir}/{test.dev.path.name}_badblocks.log'
threads.append(exe.start_thread(
hw_surface_scan.run_scan, args=(test, test_log, test_mode),
))
# Show progress
if threads[-1].is_alive():
state.ui.add_worker_pane(lines=5, watch_cmd='tail', watch_file=test_log)
# Wait for all tests to complete
try:
while True:
if any(t.is_alive() for t in threads):
state.update_progress_file()
std.sleep(5)
else:
break
except KeyboardInterrupt:
aborted = True
std.sleep(0.5)
# Handle aborts
for test in test_objects:
if not (test.disabled or test.passed or test.failed):
test.set_status('Aborted')
test.report.append(ansi.color_string(' Aborted', 'YELLOW'))
# Cleanup
state.update_progress_file()
state.ui.remove_all_worker_panes()
# Done
if aborted:
raise std.GenericAbort('Aborted')
def main() -> None:
"""Main function for hardware diagnostics."""
try:
args = argparse_helper()
except SystemExit:
print('')
cli.pause('Press Enter to exit...')
raise
log.update_log_path(dest_name='Hardware-Diagnostics', timestamp=True)
# Safety check
if 'TMUX' not in os.environ:
LOG.error('tmux session not found')
raise RuntimeError('tmux session not found')
# Init
menu = build_menu(cli_mode=args['--cli'], quick_mode=args['--quick'])
state = State(test_mode=args['--test-mode'])
# Quick Mode
if args['--quick']:
run_diags(state, menu, quick_mode=True, test_mode=args['--test-mode'])
return
# Show menu
while True:
action = None
selection = menu.advanced_select()
# Set action
if 'Audio Test' in selection:
action = audio_test
elif 'Keyboard Test' in selection:
action = keyboard_test
elif 'Network Test' in selection:
action = network_test
elif 'Clock Sync' in selection:
action = sync_clock
# Run simple test
if action:
state.update_title_text(selection[0])
try:
action()
except KeyboardInterrupt:
cli.print_warning('Aborted.')
cli.print_standard('')
cli.pause('Press Enter to return to main menu...')
if 'Clock Sync' in selection:
state.ui.update_clock()
# Secrets
if 'Matrix' in selection:
screensaver('matrix')
elif 'Tubes' in selection:
# Tubes ≈≈ Pipes?
screensaver('pipes')
# Quit
if 'Reboot' in selection:
cmd = ['/usr/local/bin/wk-power-command', 'reboot']
exe.run_program(cmd, check=False)
elif 'Power Off' in selection:
cmd = ['/usr/local/bin/wk-power-command', 'poweroff']
exe.run_program(cmd, check=False)
elif 'Quit' in selection:
break
# Start diagnostics
if 'Start' in selection:
run_diags(state, menu, quick_mode=False, test_mode=args['--test-mode'])
# Reset top pane
state.update_title_text('Main Menu')
def print_countdown(proc, seconds) -> None:
"""Print countdown to screen while proc is alive."""
seconds = int(seconds)
for i in range(seconds):
sec_left = (seconds - i) % 60
min_left = int((seconds - i) / 60)
out_str = '\r '
if min_left:
out_str += f'{min_left} minute{"s" if min_left != 1 else ""}, '
out_str += f'{sec_left} second{"s" if sec_left != 1 else ""}'
out_str += ' remaining'
print(f'{out_str:<42}', end='', flush=True)
try:
proc.wait(1)
except subprocess.TimeoutExpired:
# proc still going, continue
pass
if ((hasattr(proc, 'poll') and proc.poll() is not None)
or (hasattr(proc, 'is_running') and not proc.is_running())):
# proc exited, stop countdown
break
# Done
print('')
def run_cpu_tests(state: State, test_objects, test_mode=False) -> None:
"""Run selected CPU test(s)."""
state.update_progress_file()
cpu_tests_init(state)
for obj in test_objects:
func = globals()[TEST_GROUPS[obj.name]]
func(state, obj, test_mode=test_mode)
cpu_tests_end(state)
state.update_progress_file()
def run_diags(state: State, menu, quick_mode=False, test_mode=False) -> None:
"""Run selected diagnostics."""
aborted = False
atexit.register(state.save_debug_reports)
state.init_diags(menu)
# Just return if no tests were selected
if not state.test_groups:
cli.print_warning('No tests selected?')
cli.pause()
return
# Run tests
for group in state.test_groups:
# Run test(s)
function = group.function
args = [group.test_objects]
if group.name == 'Disk I/O Benchmark':
args.append(menu.toggles['Skip USB Benchmarks']['Selected'])
state.ui.clear_current_pane()
try:
function(state, *args, test_mode=test_mode)
except (KeyboardInterrupt, std.GenericAbort):
aborted = True
state.abort_testing()
state.update_progress_file()
state.reset_layout()
break
else:
# Run safety checks after disk tests
if group.name.startswith('Disk'):
state.disk_safety_checks()
# Handle aborts
if aborted:
for group in state.test_groups:
for test in group.test_objects:
if test.status == 'Pending':
test.set_status('Aborted')
# Show results
show_results(state)
# Done
state.save_debug_reports()
atexit.unregister(state.save_debug_reports)
if quick_mode:
cli.pause('Press Enter to exit...')
else:
cli.pause('Press Enter to return to main menu...')
def show_failed_attributes(state: State) -> None:
"""Show failed attributes for all disks."""
for dev in state.disks:
cli.print_colored([dev.name, dev.description], ['CYAN', None])
cli.print_report(
hw_smart.generate_attribute_report(dev, only_failed=True),
)
cli.print_standard('')
def show_results(state: State) -> None:
"""Show test results by device."""
std.sleep(0.5)
state.ui.clear_current_pane()
state.update_title_text('Results')
# CPU Tests
cpu_tests_enabled = [
group.name for group in state.test_groups if 'CPU' in group.name
]
if cpu_tests_enabled:
cli.print_success('CPU:')
cli.print_report(state.system.generate_report())
cli.print_standard(' ')
# Disk Tests
disk_tests_enabled = [
group.name for group in state.test_groups if 'Disk' in group.name
]
if disk_tests_enabled:
cli.print_success(f'Disk{"s" if len(state.disks) > 1 else ""}:')
for disk in state.disks:
cli.print_report(disk.generate_report())
cli.print_standard(' ')
if not state.disks:
cli.print_warning('No devices')
cli.print_standard(' ')
def sync_clock() -> None:
"""Sync clock under macOS using sntp."""
cmd = ['sudo', 'sntp', '-Ss', 'us.pool.ntp.org']
proc = exe.run_program(cmd, check=False)
if proc.returncode:
# Assuming we're running under an older version of macOS
cmd[2] = '-s'
exe.run_program(cmd, check=False)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

465
scripts/wk/hw/disk.py Normal file
View file

@ -0,0 +1,465 @@
"""WizardKit: Disk object and functions"""
# vim: sts=2 sw=2 ts=2
import logging
import pathlib
import platform
import plistlib
import re
from dataclasses import dataclass, field
from typing import Any
from wk.cfg.main import KIT_NAME_SHORT
from wk.exe import get_json_from_command, run_program
from wk.hw.test import Test
from wk.hw.smart import (
generate_attribute_report,
get_known_disk_attributes,
)
from wk.std import PLATFORM
from wk.ui import ansi
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
WK_LABEL_REGEX = re.compile(
fr'{KIT_NAME_SHORT}_(LINUX|UFD)',
re.IGNORECASE,
)
# Classes
@dataclass(slots=True)
class Disk:
"""Object for tracking disk specific data."""
attributes: dict[Any, dict] = field(init=False, default_factory=dict)
bus: str = field(init=False)
children: list[dict] = field(init=False, default_factory=list)
description: str = field(init=False)
filesystem: str = field(init=False)
initial_attributes: dict[Any, dict] = field(init=False, default_factory=dict)
known_attributes: dict[Any, dict] = field(init=False, default_factory=dict)
log_sec: int = field(init=False)
model: str = field(init=False)
name: str = field(init=False)
notes: list[str] = field(init=False, default_factory=list)
path: pathlib.Path = field(init=False)
path_str: pathlib.Path | str
parent: str = field(init=False)
phy_sec: int = field(init=False)
raw_details: dict[str, Any] = field(init=False)
raw_smartctl: dict[str, Any] = field(init=False, default_factory=dict)
serial: str = field(init=False)
size: int = field(init=False)
ssd: bool = field(init=False)
tests: list[Test] = field(init=False, default_factory=list)
trim: bool = field(init=False)
def __post_init__(self):
self.path = pathlib.Path(self.path_str).resolve()
self.update_details()
self.set_description()
self.known_attributes = get_known_disk_attributes(self.model)
if not self.is_4k_aligned():
self.add_note('One or more partitions are not 4K aligned', 'YELLOW')
def add_note(self, note, color=None) -> None:
"""Add note that will be included in the disk report."""
if color:
note = ansi.color_string(note, color)
if note not in self.notes:
self.notes.append(note)
self.notes.sort()
def contains_note(self, note_str) -> bool:
"""Check if note is already present."""
present = False
for note in self.notes:
if note_str == ansi.strip_colors(note):
present = True
return present
def disable_disk_tests(self) -> None:
"""Disable all tests."""
LOG.warning('Disabling all tests for: %s', self.path)
for test in self.tests:
if test.status in ('Pending', 'Working'):
test.set_status('Denied')
test.disabled = True
def generate_report(self, header=True) -> list[str]:
"""Generate Disk report, returns list."""
report = []
if header:
report.append(ansi.color_string(f'Device ({self.path.name})', 'BLUE'))
report.append(f' {self.description}')
# Attributes
if self.attributes:
if header:
report.append(ansi.color_string('Attributes', 'BLUE'))
report.extend(generate_attribute_report(self))
# Notes
if self.notes:
report.append(ansi.color_string('Notes', 'BLUE'))
for note in self.notes:
report.append(f' {note}')
# Tests
for test in self.tests:
report.extend(test.report)
return report
def get_labels(self) -> list[str]:
"""Build list of labels for this disk, returns list."""
labels = []
# Add all labels from raw_details
for details in [self.raw_details, *self.raw_details.get('children', [])]:
labels.append(details.get('label', ''))
labels.append(details.get('partlabel', ''))
# Remove empty labels
labels = [str(label) for label in labels if label]
# Done
return labels
def is_4k_aligned(self) -> bool:
"""Check that all disk partitions are aligned, returns bool."""
aligned = True
if PLATFORM == 'Darwin':
aligned = is_4k_aligned_macos(self.raw_details)
elif PLATFORM == 'Linux':
aligned = is_4k_aligned_linux(self.path, self.phy_sec)
return aligned
@property
def present(self) -> bool:
"""Verify this device is still present, returns bool."""
if not self.path.exists():
self.add_note('Device disconnected', 'RED')
return False
return True
def set_description(self) -> None:
"""Set disk description from details."""
decimals = 1
suffix = ' '
# Set size_str (try binary scale first)
for scale in (1024, 1000):
size = float(self.size)
units = list('KMGTPEZY')
while units:
if abs(size) < scale:
break
size /= scale
suffix = units.pop(0)
size = ((size * 10) // 1) / 10
if size % 1 == 0:
# Found an exact whole number, drop the decimal
decimals = 0
break
if size % 1 == 0.5:
break
# Done
self.description = (
f'{size:0.{decimals}f} {suffix}B ({self.bus}) {self.model} {self.serial}'
)
def update_details(self, skip_children=True) -> None:
"""Update disk details using OS specific methods.
Required details default to generic descriptions
and are converted to the correct type.
"""
if not self.present:
return
if PLATFORM == 'Darwin':
self.raw_details = get_disk_details_macos(
self.path, skip_children=skip_children,
)
elif PLATFORM == 'Linux':
self.raw_details = get_disk_details_linux(
self.path, skip_children=skip_children,
)
# Set necessary details
self.bus = str(self.raw_details.get('bus', '???')).upper()
self.bus = self.bus.replace('IMAGE', 'Image')
self.bus = self.bus.replace('NVME', 'NVMe')
self.children = self.raw_details.get('children', [])
self.filesystem = self.raw_details.get('fstype', 'Unknown')
self.log_sec = self.raw_details.get('log-sec', 512)
self.model = self.raw_details.get('model', 'Unknown Model')
self.name = self.raw_details.get('name', self.path)
self.parent = self.raw_details.get('parent', None)
self.phy_sec = self.raw_details.get('phy-sec', 512)
self.serial = self.raw_details.get('serial', 'Unknown Serial')
self.size = self.raw_details.get('size', -1)
self.ssd = self.raw_details.get('ssd', False)
self.trim = self.raw_details.get('trim', False)
# Ensure certain attributes types
## NOTE: This is ugly, deal.
for attr in ['bus', 'model', 'name', 'serial']:
setattr(self, attr, str(getattr(self, attr)))
for attr in ['log_sec', 'phy_sec', 'size']:
try:
setattr(self, attr, int(getattr(self, attr)))
except (TypeError, ValueError):
LOG.error('Invalid disk %s: %s', attr, getattr(self, attr))
if attr == 'size':
setattr(self, attr, -1)
# Add TRIM note
if self.trim:
self.add_note('TRIM support detected', 'YELLOW')
# Functions
def get_disk_details_linux(disk_path, skip_children=True) -> dict[Any, Any]:
"""Get disk details using lsblk, returns dict."""
def _flatten_json(dev) -> list:
"""Convert lsblk JSON tree to a flat list of items, returns list."""
devs = [dev]
for child in dev.pop('children', []):
devs.extend(_flatten_json(child))
return devs
# Get lsblk info
cmd = ['lsblk', '--bytes', '--json', '--output-all', '--paths', disk_path]
if skip_children:
cmd.append('--nodeps')
json_data = get_json_from_command(cmd, check=False)
dev_list = _flatten_json(json_data.get('blockdevices', [{}])[0])
# Fix details
for dev in dev_list:
dev['bus'] = dev.pop('tran', '???')
dev['parent'] = dev.pop('pkname', None)
dev['ssd'] = not dev.pop('rota', True)
dev['trim'] = bool(dev.pop('disc-max', 0))
if 'loop' in str(disk_path) and dev['bus'] is None:
dev['bus'] = 'Image'
dev['model'] = ''
dev['serial'] = ''
dev['trim'] = False # NOTE: This check is just for physical devices
# Convert to dict
details = dev_list.pop(0)
details['children'] = dev_list
# Done
return details
def get_disk_details_macos(disk_path, skip_children=True) -> dict:
"""Get disk details using diskutil, returns dict."""
details = {}
disk_path = pathlib.Path(disk_path)
# Get "list" details
cmd = ['diskutil', 'list', '-plist', disk_path]
proc = run_program(cmd, check=False, encoding=None, errors=None)
try:
plist_data = plistlib.loads(proc.stdout)
except (TypeError, ValueError):
# Invalid / corrupt plist data? return empty dict to avoid crash
LOG.error('Failed to get diskutil list for %s', disk_path)
return details
# Parse "list" details
details = plist_data.get('AllDisksAndPartitions', [{}])[0]
details['path'] = disk_path
if skip_children:
details['children'] = []
else:
details['children'] = details.pop('Partitions', [])
details['children'].extend(details.pop('APFSVolumes', []))
for child in details['children']:
child['path'] = disk_path.with_name(child['DeviceIdentifier'])
# Get "info" details
for dev in [details, *details['children']]:
cmd = ['diskutil', 'info', '-plist', dev['path']]
proc = run_program(cmd, check=False, encoding=None, errors=None)
try:
plist_data = plistlib.loads(proc.stdout)
except (TypeError, ValueError):
LOG.error('Failed to get diskutil info for %s', dev['path'])
continue
# Parse "info" details
dev.update(plist_data)
dev['bus'] = dev.pop('BusProtocol', '???')
dev['fstype'] = dev.pop('FilesystemType', '')
dev['label'] = dev.pop('VolumeName', '')
dev['model'] = dev.pop('MediaName', 'Unknown')
dev['mountpoint'] = dev.pop('MountPoint', '')
dev['name'] = dev.get('name', str(dev['path']))
dev['phy-sec'] = dev.pop('DeviceBlockSize', 512)
dev['serial'] = get_disk_serial_macos(dev['path'])
dev['size'] = dev.pop('Size', -1)
dev['ssd'] = dev.pop('SolidState', False)
dev['trim'] = False # TODO: ACtually check for TRIM
dev['vendor'] = ''
if dev.get('WholeDisk', True):
dev['parent'] = None
else:
dev['parent'] = dev.pop('ParentWholeDisk', None)
# Fix details if main dev is a child
for child in details['children']:
if disk_path == child['path']:
for key in ('fstype', 'label', 'name', 'size'):
details[key] = child[key]
break
# Done
return details
def get_disk_serial_macos(path) -> str:
"""Get disk serial using system_profiler, returns str."""
cmd = ['sudo', 'smartctl', '--info', '--json', path]
smart_info = get_json_from_command(cmd)
return smart_info.get('serial_number', 'Unknown Serial')
def get_disks(skip_kits=False) -> list[Disk]:
"""Get disks using OS-specific methods, returns list."""
disks = []
if PLATFORM == 'Darwin':
disks = get_disks_macos()
elif PLATFORM == 'Linux':
disks = get_disks_linux()
# Skip WK disks
if skip_kits:
for disk in disks:
disk.update_details(skip_children=False)
disks = [
disk_obj for disk_obj in disks
if not any(
WK_LABEL_REGEX.search(label) for label in disk_obj.get_labels()
)
]
# Done
return disks
def get_disks_linux() -> list[Disk]:
"""Get disks via lsblk, returns list."""
cmd = ['lsblk', '--json', '--nodeps', '--paths']
disks = []
# Add valid disks
json_data = get_json_from_command(cmd)
for disk in json_data.get('blockdevices', []):
disk_obj = Disk(disk['name'])
# Skip loopback devices, optical devices, etc
if disk_obj.raw_details.get('type', '???') != 'disk':
continue
# Skip empty devices (usually card readers)
if disk_obj.size <= 0:
continue
# Add disk
disks.append(disk_obj)
# Done
return disks
def get_disks_macos() -> list[Disk]:
"""Get disks via diskutil, returns list."""
cmd = ['diskutil', 'list', '-plist', 'physical']
disks = []
# El Capitan workaround
if platform.mac_ver()[0].startswith('10.11'):
cmd.pop()
# Get info from diskutil
proc = run_program(cmd, encoding=None, errors=None, check=False)
# Parse plist data
try:
plist_data = plistlib.loads(proc.stdout)
except (TypeError, ValueError):
# Invalid / corrupt plist data? return empty list to avoid crash
LOG.error('Failed to get diskutil list')
return disks
# Add valid disks
for disk in plist_data['AllDisksAndPartitions']:
name = disk['DeviceIdentifier']
if name not in plist_data['WholeDisks']:
# Only check "WholeDisks"
continue
if not disk['Content']:
# This lists GPT or MBR for device, blank should mean it's an image
continue
disks.append(Disk(f'/dev/{name}'))
# Remove virtual disks
disks = [
d for d in disks if d.raw_details.get('VirtualOrPhysical') != 'Virtual'
]
# Done
return disks
def is_4k_aligned_macos(disk_details) -> bool:
"""Check partition alignment using diskutil info, returns bool."""
aligned = True
# Check partitions
for part in disk_details.get('children', []):
offset = part.get('PartitionMapPartitionOffset', 0)
if not offset:
# Assuming offset couldn't be found and it defaulted to 0
# NOTE: Just logging the error, not bailing
LOG.error('Failed to get partition offset for %s', part['path'])
aligned = aligned and offset >= 0 and offset % 4096 == 0
# Done
return aligned
def is_4k_aligned_linux(dev_path, physical_sector_size) -> bool:
"""Check partition alignment using lsblk, returns bool."""
aligned = True
cmd = [
'sudo',
'sfdisk',
'--json',
dev_path,
]
# Get partition details
json_data = get_json_from_command(cmd)
# Check partitions
for part in json_data.get('partitiontable', {}).get('partitions', []):
offset = physical_sector_size * part.get('start', -1)
aligned = aligned and offset >= 0 and offset % 4096 == 0
# Done
return aligned
if __name__ == '__main__':
print("This file is not meant to be called directly.")

32
scripts/wk/hw/keyboard.py Normal file
View file

@ -0,0 +1,32 @@
"""WizardKit: Keyboard test functions"""
# vim: sts=2 sw=2 ts=2
import logging
from wk.exe import run_program
from wk.std import PLATFORM
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
# Functions
def keyboard_test() -> None:
"""Test keyboard using OS specific functions."""
if PLATFORM == 'Linux':
run_xev()
else:
LOG.error('Not supported under this OS: %s', PLATFORM)
raise NotImplementedError(f'Not supported under this OS: {PLATFORM}')
def run_xev() -> None:
"""Test keyboard using xev."""
LOG.info('Keyboard Test (xev)')
cmd = ['xev', '-event', 'keyboard']
run_program(cmd, check=False, pipe=False)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

Some files were not shown because too many files have changed in this diff Show more