Compare commits

...

2051 commits
v1.0.0 ... dev

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
b8a088d3b6 2017-11: Retroactive Updates
* Network drivers disabled (for now until the sigs are manually verified)
* Replaced Notepad2-Mod with Notepad++
2017-11-24 21:15:32 -08:00
Alan Mason
1e02eb44a5 2017-08: Retroactive Updates
* Faster WIM creation
  * (Removed compression)
2017-11-24 21:13:50 -08:00
Alan Mason
50d53beef6 2017-04: Retroactive Updates
* Adjusted data loss waning
2017-11-24 21:12:54 -08:00
Alan Mason
827f9bce6a 2017-03: Retroactive Updates
Fixed using local windows images

* Bugfix: remove_volume_letters() was not preserving the "keep" letter
  * First issue: if keep==None then it would crash
  * Second issue: The passed keep value was outdated (See bugfix below)
* Bugfix: undesired call of assign_volume_letters()
  * prep_disk_for_formatting() resets the volume letters thus breaking local installs
  * By moving find_windows_image() to be called afterwards this is fixed but perhaps another refactor is in order?
2017-11-24 21:11:56 -08:00
Alan Mason
1da75165f9 2017-02: Retroactive Updates
* The working dir should now be X:\WK
  * Useful when quiting out of python to troubleshooting
* Safer setup and formatting cleanup
  * Backup summary is now more detailed
  * Setup messages now more closely match the backup messages
  * More checks are done during under format_gpt() and format_mbr()
  * Setup specific functions have been refactored for easier reading
* ConEmu settings update
  * No longer minimizes to the systray
    * This helps to prevent locking yourself out of the console
  * Added new color schemes
* Bugfixes and Formatting
  * Install Windows has been renamed Setup Windows to match function names
  * Setup Windows summary screen is more detailed now
  * Setup Windows drive formatting auth questions are now at the end
    * Also reworded warning
  * Bugfix: all regex calls now case insensitive.
    * i.e. You can answer yes with 'y' or 'Y' or 'Yes' now
2017-11-24 21:09:57 -08:00
Alan Mason
e05d2ce862 2017-01: Retroactive Updates
* Added get_volumes()
  * This makes Assign/Remove letters sections more readable
* Adjusted WinPE launch settings
  * Should now chdir to X:\WK
  * Added menu.cmd for easier (re)launching of menu
    * i.e. just type `menu`
* Enabled  user to return to the main menu after a major crash
* make.cmd: Changed iso names to match the Linux build names
* Refactored backup imaging code
  * More readable
  * More consistent variable naming
  * Moved classes and abort function to functions.py
* Refactored disk/partition info sections
* Refactored Windows Setup sections
  * Much more readable menu section
  * Majority of code moved to functions.py
  * More consistent variable naming
  * Boot mode detection now a callable function
  * Expanded WinRE section to match current recommended setup
    * WinRE is now setup for Legacy setups running Win8+
    * Problems during setup will again be reported as errors instead of warnings
  * Verify source windows images and abort if invalid
    * Allows for earlier aborts which will reduce wasted time
* Reordered functions to be in alphabetical order
* Updated tools
  * Enabled file/folder size display in Q-Dir
  * Switched back to the standard ConEmu (instead of the Cmder build)
  * Updated scripts for Python 3.6
    * This version has a different sys.path so the import code was adjusted
  * REMOVED Explorer++
  * REMOVED HWMonitor

* Bugfix: fixed discrepancies between x32 & x64
* Bugfix: relaunching the menu now stays in the current window
2017-11-24 21:08:39 -08:00
Alan Mason
93250b22ed 2016-10: Retroactive Updates
* HWiNFO added
* Q-Dir added
  * Perhaps a replacement for Explorer++
2017-11-24 21:07:03 -08:00
Alan Mason
8cf135d9eb 2016-09: Retroactive Updates
* Added WIM backup image verification phase
* WIM backup images now created much faster
  * This was done by not creating the extra integrity information
* Readded support for swm files
* ComEmu will now open in fullscreen mode without the titlebar
2017-11-24 21:05:40 -08:00
Alan Mason
29c1870957 2016-08: Retroactive Updates
## Major Update ##

* Converted all scripts to Python
* Replaced ConEmu with ConEmu-maximus5 from cmder
* Adjusted the menu so that entries are still aligned for lists of 10+
  * This applies to both numbered and lettered entries
* Can now select which MiniDump path to load for BlueScreenView
* General disks / volumes
  * Better detection of non-partitioned drives
  * Detect and store the partition MBR Type / GPT GUIDs
    * Added a Partition UID list for better identification of partitions
    * Hide the extra partition details if currently accessible
2017-11-24 21:04:39 -08:00
Alan Mason
cf4092f57b 2016-06: Retroactive Updates
* Don't load PowerShell profiles (-NoProfile)
  * This should reduce the startup time for most actions in WinPE
* MCT Windows 10 isos no longer have "Technical Preview" in the names
* make.cmd script simplified and now removes more language folders
2017-11-24 21:03:11 -08:00
Alan Mason
919c4e73a2 2016-04: Retroactive Updates
* Finished code for 32-bit and 64-bit builds
  * Unified scripts for use under both builds
2017-11-24 21:01:27 -08:00
Alan Mason
6818922ba8 2016-03: Retroactive Updates
* Started work on building 32-bit and 64-bit images
2017-11-24 20:59:32 -08:00
Alan Mason
4ed08ebb9b 2016-02: Retroactive Updates 2017-11-24 20:55:45 -08:00
Alan Mason
41272c03ab 2016-01: Retroactive Updates 2017-11-24 20:50:41 -08:00
Alan Mason
c7b5abb0bc 2015-12: Retroactive Updates 2017-11-24 20:48:55 -08:00
Alan Mason
18c2c4a961 2015-11: Retroactive initial commit 2017-11-24 20:47:02 -08:00
689 changed files with 49483 additions and 9439 deletions

View file

@ -1,152 +0,0 @@
:: Wizard Kit: Copy Kit ::
@echo off
:Init
setlocal EnableDelayedExpansion
title Wizard Kit: Tools Copier
color 1b
echo Initializing...
call :CheckFlags %*
call :FindBin
call :SetTitle Tools Copier
:SetVariables
rem Set variables using settings\main.py file
set "SETTINGS=%bin%\Scripts\settings\main.py"
for %%v in (ARCHIVE_PASSWORD KIT_NAME_FULL) do (
set "var=%%v"
for /f "tokens=* usebackq" %%f in (`findstr "!var!=" %SETTINGS%`) do (
set "_v=%%f"
set "_v=!_v:*'=!"
set "%%v=!_v:~0,-1!"
)
)
rem Set ARCH to 32 as a gross assumption and check for x86_64 status
set ARCH=32
if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" set "ARCH=64"
set "SEVEN_ZIP=%bin%\7-Zip\7za.exe"
set "CON=%bin%\ConEmu\ConEmu.exe"
set "FASTCOPY=%bin%\FastCopy\FastCopy.exe"
if %ARCH% equ 64 (
set "SEVEN_ZIP=%bin%\7-Zip\7za64.exe"
set "CON=%bin%\ConEmu\ConEmu64.exe"
set "FASTCOPY=%bin%\FastCopy\FastCopy64.exe"
)
set "fastcopy_args=/cmd=diff /no_ui /auto_close"
rem Set %client_dir%
call "%bin%\Scripts\init_client_dir.cmd"
pushd "%bin%\.."
set "source=%cd%"
popd
set "dest=%client_dir%\Tools"
:RelaunchInConEmu
if not defined IN_CONEMU (
if not defined L_NCMD (
set "con_args=-new_console:n"
rem If in DEBUG state then force ConEmu to stay open
if defined DEBUG (set "con_args=!con_args! -new_console:c")
set IN_CONEMU=True
start "" "%CON%" -run ""%~0" %*" !con_args! || goto ErrorUnknown
exit /b 0
)
)
:CopyBin
echo Copying .bin...
mkdir "%dest%\.bin" >nul 2>&1
attrib +h "%dest%\.bin"
set _sources="%bin%\7-Zip"
set _sources=%_sources% "%bin%\ConEmu"
set _sources=%_sources% "%bin%\FastCopy"
set _sources=%_sources% "%bin%\HWiNFO"
set _sources=%_sources% "%bin%\Python"
set _sources=%_sources% "%bin%\Scripts"
start "" /wait "%fastcopy%" %fastcopy_args% %_sources% /to="%dest%\.bin\"
:CopyCBin
echo Copying .cbin...
mkdir "%dest%\.cbin" >nul 2>&1
attrib +h "%dest%\.cbin"
start "" /wait "%fastcopy%" %fastcopy_args% %cbin%\* /to="%dest%\.cbin\"
:CopyMainData
echo Copying Main Kit...
set _sources="%source%\Data Transfers"
set _sources=%_sources% "%source%\Diagnostics"
set _sources=%_sources% "%source%\Drivers"
set _sources=%_sources% "%source%\Installers"
set _sources=%_sources% "%source%\Misc"
set _sources=%_sources% "%source%\Repairs"
set _sources=%_sources% "%source%\Uninstallers"
set _sources=%_sources% "%source%\Activate Windows.cmd"
set _sources=%_sources% "%source%\Enter SafeMode.cmd"
set _sources=%_sources% "%source%\Exit SafeMode.cmd"
set _sources=%_sources% "%source%\LICENSE.txt"
set _sources=%_sources% "%source%\README.md"
set _sources=%_sources% "%source%\System Checklist.cmd"
set _sources=%_sources% "%source%\System Diagnostics.cmd"
set _sources=%_sources% "%source%\User Checklist.cmd"
start "" /wait "%fastcopy%" %fastcopy_args% /exclude="Snappy Driver Installer.cmd;*.exe" %_sources% /to="%dest%\"
start "" /wait "%fastcopy%" %fastcopy_args% "%source%\Installers\Extras\Office\Adobe Reader DC.exe" /to="%dest%\Installers\Extras\Office\"
:Ninite
echo Extracting Ninite installers...
"%SEVEN_ZIP%" x "%cbin%\_Ninite.7z" -aos -bso0 -bse0 -bsp0 -p%ARCHIVE_PASS% -o"%dest%\Installers\Extras" || goto Abort
:OpenFolder
start "" explorer "%dest%"
goto Exit
:: Functions ::
:CheckFlags
rem Loops through all arguments to check for accepted flags
set DEBUG=
for %%f in (%*) do (
if /i "%%f" == "/DEBUG" (@echo on & set "DEBUG=/DEBUG")
)
@exit /b 0
:FindBin
rem Checks the current directory and all parents for the ".bin" folder
rem NOTE: Has not been tested for UNC paths
set bin=
pushd "%~dp0"
:FindBinInner
if exist ".bin" (goto FindBinDone)
if "%~d0\" == "%cd%" (popd & @exit /b 1)
cd ..
goto FindBinInner
:FindBinDone
set "bin=%cd%\.bin"
set "cbin=%cd%\.cbin"
popd
@exit /b 0
:SetTitle
rem Sets title using KIT_NAME_FULL from settings\main.py
set "window_title=%*"
if not defined window_title set "window_title=Launcher"
set "window_title=%KIT_NAME_FULL%: %window_title%"
title %window_title%
@exit /b 0
:: Errors ::
:ErrorNoBin
echo.
echo ERROR: ".bin" folder not found.
goto Abort
:Abort
color 4e
echo Aborted.
echo Press any key to exit...
pause>nul
color
rem Set errorlevel to 1 by calling color incorrectly
color 00
goto Exit
:: Cleanup and exit ::
:Exit
endlocal
exit /b %errorlevel%

View file

@ -1,62 +0,0 @@
# Wizard Kit: Activate Windows using various methods
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.activation import *
init_global_vars()
os.system('title {}: Windows Activation Tool'.format(KIT_NAME_FULL))
if __name__ == '__main__':
try:
stay_awake()
os.system('cls')
print_info('{}: Windows Activation Tool\n'.format(KIT_NAME_FULL))
# Bail early if already activated
if windows_is_activated():
print_info('This system is already activated')
sleep(5)
exit_script()
other_results = {
'Error': {
'BIOSKeyNotFoundError': 'BIOS key not found.',
}}
# Determine activation method
activation_methods = [
{'Name': 'Activate with BIOS key', 'Function': activate_with_bios},
]
if global_vars['OS']['Version'] not in ['8', '10']:
activation_methods[0]['Disabled'] = True
actions = [
{'Name': 'Quit', 'Letter': 'Q'},
]
while True:
selection = menu_select(
'{}: Windows Activation Menu'.format(KIT_NAME_FULL),
main_entries=activation_methods, action_entries=actions)
if (selection.isnumeric()):
result = try_and_print(
message = activation_methods[int(selection)-1]['Name'],
function = activation_methods[int(selection)-1]['Function'],
other_results=other_results)
if result['CS']:
break
else:
sleep(2)
elif selection == 'Q':
exit_script()
# Done
print_success('\nDone.')
pause("Press Enter to exit...")
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2014 Michael Kropat
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.

View file

@ -1,164 +0,0 @@
import ctypes, sys
from ctypes import windll, wintypes
from uuid import UUID
class GUID(ctypes.Structure): # [1]
_fields_ = [
("Data1", wintypes.DWORD),
("Data2", wintypes.WORD),
("Data3", wintypes.WORD),
("Data4", wintypes.BYTE * 8)
]
def __init__(self, uuid_):
ctypes.Structure.__init__(self)
self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid_.fields
for i in range(2, 8):
self.Data4[i] = rest>>(8 - i - 1)*8 & 0xff
class FOLDERID: # [2]
AccountPictures = UUID('{008ca0b1-55b4-4c56-b8a8-4de4b299d3be}')
AdminTools = UUID('{724EF170-A42D-4FEF-9F26-B60E846FBA4F}')
ApplicationShortcuts = UUID('{A3918781-E5F2-4890-B3D9-A7E54332328C}')
CameraRoll = UUID('{AB5FB87B-7CE2-4F83-915D-550846C9537B}')
CDBurning = UUID('{9E52AB10-F80D-49DF-ACB8-4330F5687855}')
CommonAdminTools = UUID('{D0384E7D-BAC3-4797-8F14-CBA229B392B5}')
CommonOEMLinks = UUID('{C1BAE2D0-10DF-4334-BEDD-7AA20B227A9D}')
CommonPrograms = UUID('{0139D44E-6AFE-49F2-8690-3DAFCAE6FFB8}')
CommonStartMenu = UUID('{A4115719-D62E-491D-AA7C-E74B8BE3B067}')
CommonStartup = UUID('{82A5EA35-D9CD-47C5-9629-E15D2F714E6E}')
CommonTemplates = UUID('{B94237E7-57AC-4347-9151-B08C6C32D1F7}')
Contacts = UUID('{56784854-C6CB-462b-8169-88E350ACB882}')
Cookies = UUID('{2B0F765D-C0E9-4171-908E-08A611B84FF6}')
Desktop = UUID('{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}')
DeviceMetadataStore = UUID('{5CE4A5E9-E4EB-479D-B89F-130C02886155}')
Documents = UUID('{FDD39AD0-238F-46AF-ADB4-6C85480369C7}')
DocumentsLibrary = UUID('{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}')
Downloads = UUID('{374DE290-123F-4565-9164-39C4925E467B}')
Favorites = UUID('{1777F761-68AD-4D8A-87BD-30B759FA33DD}')
Fonts = UUID('{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}')
GameTasks = UUID('{054FAE61-4DD8-4787-80B6-090220C4B700}')
History = UUID('{D9DC8A3B-B784-432E-A781-5A1130A75963}')
ImplicitAppShortcuts = UUID('{BCB5256F-79F6-4CEE-B725-DC34E402FD46}')
InternetCache = UUID('{352481E8-33BE-4251-BA85-6007CAEDCF9D}')
Libraries = UUID('{1B3EA5DC-B587-4786-B4EF-BD1DC332AEAE}')
Links = UUID('{bfb9d5e0-c6a9-404c-b2b2-ae6db6af4968}')
LocalAppData = UUID('{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}')
LocalAppDataLow = UUID('{A520A1A4-1780-4FF6-BD18-167343C5AF16}')
LocalizedResourcesDir = UUID('{2A00375E-224C-49DE-B8D1-440DF7EF3DDC}')
Music = UUID('{4BD8D571-6D19-48D3-BE97-422220080E43}')
MusicLibrary = UUID('{2112AB0A-C86A-4FFE-A368-0DE96E47012E}')
NetHood = UUID('{C5ABBF53-E17F-4121-8900-86626FC2C973}')
OriginalImages = UUID('{2C36C0AA-5812-4b87-BFD0-4CD0DFB19B39}')
PhotoAlbums = UUID('{69D2CF90-FC33-4FB7-9A0C-EBB0F0FCB43C}')
PicturesLibrary = UUID('{A990AE9F-A03B-4E80-94BC-9912D7504104}')
Pictures = UUID('{33E28130-4E1E-4676-835A-98395C3BC3BB}')
Playlists = UUID('{DE92C1C7-837F-4F69-A3BB-86E631204A23}')
PrintHood = UUID('{9274BD8D-CFD1-41C3-B35E-B13F55A758F4}')
Profile = UUID('{5E6C858F-0E22-4760-9AFE-EA3317B67173}')
ProgramData = UUID('{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}')
ProgramFiles = UUID('{905e63b6-c1bf-494e-b29c-65b732d3d21a}')
ProgramFilesX64 = UUID('{6D809377-6AF0-444b-8957-A3773F02200E}')
ProgramFilesX86 = UUID('{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}')
ProgramFilesCommon = UUID('{F7F1ED05-9F6D-47A2-AAAE-29D317C6F066}')
ProgramFilesCommonX64 = UUID('{6365D5A7-0F0D-45E5-87F6-0DA56B6A4F7D}')
ProgramFilesCommonX86 = UUID('{DE974D24-D9C6-4D3E-BF91-F4455120B917}')
Programs = UUID('{A77F5D77-2E2B-44C3-A6A2-ABA601054A51}')
Public = UUID('{DFDF76A2-C82A-4D63-906A-5644AC457385}')
PublicDesktop = UUID('{C4AA340D-F20F-4863-AFEF-F87EF2E6BA25}')
PublicDocuments = UUID('{ED4824AF-DCE4-45A8-81E2-FC7965083634}')
PublicDownloads = UUID('{3D644C9B-1FB8-4f30-9B45-F670235F79C0}')
PublicGameTasks = UUID('{DEBF2536-E1A8-4c59-B6A2-414586476AEA}')
PublicLibraries = UUID('{48DAF80B-E6CF-4F4E-B800-0E69D84EE384}')
PublicMusic = UUID('{3214FAB5-9757-4298-BB61-92A9DEAA44FF}')
PublicPictures = UUID('{B6EBFB86-6907-413C-9AF7-4FC2ABF07CC5}')
PublicRingtones = UUID('{E555AB60-153B-4D17-9F04-A5FE99FC15EC}')
PublicUserTiles = UUID('{0482af6c-08f1-4c34-8c90-e17ec98b1e17}')
PublicVideos = UUID('{2400183A-6185-49FB-A2D8-4A392A602BA3}')
QuickLaunch = UUID('{52a4f021-7b75-48a9-9f6b-4b87a210bc8f}')
Recent = UUID('{AE50C081-EBD2-438A-8655-8A092E34987A}')
RecordedTVLibrary = UUID('{1A6FDBA2-F42D-4358-A798-B74D745926C5}')
ResourceDir = UUID('{8AD10C31-2ADB-4296-A8F7-E4701232C972}')
Ringtones = UUID('{C870044B-F49E-4126-A9C3-B52A1FF411E8}')
RoamingAppData = UUID('{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}')
RoamedTileImages = UUID('{AAA8D5A5-F1D6-4259-BAA8-78E7EF60835E}')
RoamingTiles = UUID('{00BCFC5A-ED94-4e48-96A1-3F6217F21990}')
SampleMusic = UUID('{B250C668-F57D-4EE1-A63C-290EE7D1AA1F}')
SamplePictures = UUID('{C4900540-2379-4C75-844B-64E6FAF8716B}')
SamplePlaylists = UUID('{15CA69B3-30EE-49C1-ACE1-6B5EC372AFB5}')
SampleVideos = UUID('{859EAD94-2E85-48AD-A71A-0969CB56A6CD}')
SavedGames = UUID('{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}')
SavedSearches = UUID('{7d1d3a04-debb-4115-95cf-2f29da2920da}')
Screenshots = UUID('{b7bede81-df94-4682-a7d8-57a52620b86f}')
SearchHistory = UUID('{0D4C3DB6-03A3-462F-A0E6-08924C41B5D4}')
SearchTemplates = UUID('{7E636BFE-DFA9-4D5E-B456-D7B39851D8A9}')
SendTo = UUID('{8983036C-27C0-404B-8F08-102D10DCFD74}')
SidebarDefaultParts = UUID('{7B396E54-9EC5-4300-BE0A-2482EBAE1A26}')
SidebarParts = UUID('{A75D362E-50FC-4fb7-AC2C-A8BEAA314493}')
SkyDrive = UUID('{A52BBA46-E9E1-435f-B3D9-28DAA648C0F6}')
SkyDriveCameraRoll = UUID('{767E6811-49CB-4273-87C2-20F355E1085B}')
SkyDriveDocuments = UUID('{24D89E24-2F19-4534-9DDE-6A6671FBB8FE}')
SkyDrivePictures = UUID('{339719B5-8C47-4894-94C2-D8F77ADD44A6}')
StartMenu = UUID('{625B53C3-AB48-4EC1-BA1F-A1EF4146FC19}')
Startup = UUID('{B97D20BB-F46A-4C97-BA10-5E3608430854}')
System = UUID('{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}')
SystemX86 = UUID('{D65231B0-B2F1-4857-A4CE-A8E7C6EA7D27}')
Templates = UUID('{A63293E8-664E-48DB-A079-DF759E0509F7}')
UserPinned = UUID('{9E3995AB-1F9C-4F13-B827-48B24B6C7174}')
UserProfiles = UUID('{0762D272-C50A-4BB0-A382-697DCD729B80}')
UserProgramFiles = UUID('{5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}')
UserProgramFilesCommon = UUID('{BCBD3057-CA5C-4622-B42D-BC56DB0AE516}')
Videos = UUID('{18989B1D-99B5-455B-841C-AB7C74E4DDFC}')
VideosLibrary = UUID('{491E922F-5643-4AF4-A7EB-4E7A138D8174}')
Windows = UUID('{F38BF404-1D43-42F2-9305-67DE0B28FC23}')
class UserHandle: # [3]
current = wintypes.HANDLE(0)
common = wintypes.HANDLE(-1)
_CoTaskMemFree = windll.ole32.CoTaskMemFree # [4]
_CoTaskMemFree.restype= None
_CoTaskMemFree.argtypes = [ctypes.c_void_p]
_SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath # [5] [3]
_SHGetKnownFolderPath.argtypes = [
ctypes.POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, ctypes.POINTER(ctypes.c_wchar_p)
]
class PathNotFoundException(Exception): pass
def get_path(folderid, user_handle=UserHandle.common):
fid = GUID(folderid)
pPath = ctypes.c_wchar_p()
S_OK = 0
if _SHGetKnownFolderPath(ctypes.byref(fid), 0, user_handle, ctypes.byref(pPath)) != S_OK:
raise PathNotFoundException()
path = pPath.value
_CoTaskMemFree(pPath)
return path
if __name__ == '__main__':
if len(sys.argv) < 2 or sys.argv[1] in ['-?', '/?']:
print('python knownpaths.py FOLDERID {current|common}')
sys.exit(0)
try:
folderid = getattr(FOLDERID, sys.argv[1])
except AttributeError:
print('Unknown folder id "%s"' % sys.argv[1], file=sys.stderr)
sys.exit(1)
try:
if len(sys.argv) == 2:
print(get_path(folderid))
else:
print(get_path(folderid, getattr(UserHandle, sys.argv[2])))
except PathNotFoundException:
print('Folder not found "%s"' % ' '.join(sys.argv[1:]), file=sys.stderr)
sys.exit(1)
# [1] http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx
# [2] http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx
# [3] http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx
# [4] http://msdn.microsoft.com/en-us/library/windows/desktop/ms680722.aspx
# [5] http://www.themacaque.com/?p=954

View file

@ -1,170 +0,0 @@
# Wizard Kit: Download kit components
## Init ##
clear
$host.UI.RawUI.WindowTitle = "Wizard Kit: Build Tool"
$wd = $(Split-Path $MyInvocation.MyCommand.Path)
$bin = (Get-Item $wd).Parent.FullName
$root = (Get-Item "$bin\..").FullName # Get-Item $bin fails
# (I'm assuming that starting with a '.' is the issue)
$tmp = "{0}\tmp" -f $bin
$errors = 0
pushd "$wd"
$host.UI.RawUI.BackgroundColor = "black"
$host.UI.RawUI.ForegroundColor = "white"
$progressPreference = 'silentlyContinue'
## Functions ##
function download-file {
param ([String]$path, [String]$name, [String]$url)
$outfile = "{0}\{1}" -f $path, $name
Write-Host ("Downloading: {0}" -f $name)
New-Item -Type Directory $path 2>&1 | Out-Null
try {
invoke-webrequest -uri $url -outfile $outfile
}
catch {
Write-Host (" ERROR: Failed to download file." ) -foregroundcolor "Red"
$errors += 1
}
}
function find-dynamic-url {
param ([String]$source_page, [String]$regex)
$d_url = ""
# Get source page
invoke-webrequest -uri $source_page -outfile "tmp_page"
# Search for real url
$d_url = Get-Content "tmp_page" | Where-Object {$_ -imatch $regex}
$d_url = $d_url -ireplace '.*(a |)href="([^"]+)".*', '$2'
$d_url = $d_url -ireplace ".*(a |)href='([^']+)'.*", '$2'
# Remove tmp_page
Remove-Item "tmp_page"
return $d_url
}
function wk_pause {
param([string]$message = "Press Enter to continue... ")
Write-Host $message
$x = read-host
}
## Download ##
$path = $tmp
# 7-Zip
$url = "http://www.7-zip.org/a/7z1701.msi"
download-file $path "7z-installer.msi" $url
$url = "http://www.7-zip.org/a/7z1701-extra.7z"
download-file $path "7z-extra.7z" $url
# ConEmu
$url = "https://github.com/Maximus5/ConEmu/releases/download/v17.11.09/ConEmuPack.171109.7z"
download-file $path "ConEmuPack.7z" $url
# Notepad++
$url = "https://notepad-plus-plus.org/repository/7.x/7.5.1/npp.7.5.1.bin.minimalist.7z"
download-file $path "npp.7z" $url
# Python
$url = "https://www.python.org/ftp/python/3.6.3/python-3.6.3-embed-win32.zip"
download-file $path "python32.zip" $url
$url = "https://www.python.org/ftp/python/3.6.3/python-3.6.3-embed-amd64.zip"
download-file $path "python64.zip" $url
# Python: psutil
$dl_page = "https://pypi.python.org/pypi/psutil"
$regex = "href=.*-cp36-cp36m-win32.whl"
$url = find-dynamic-url $dl_page $regex
download-file $path "psutil32.whl" $url
$regex = "href=.*-cp36-cp36m-win_amd64.whl"
$url = find-dynamic-url $dl_page $regex
download-file $path "psutil64.whl" $url
# Python: requests & dependancies
$regex = "href=.*.py3-none-any.whl"
foreach ($mod in @("chardet", "certifi", "idna", "urllib3", "requests")) {
$dl_page = "https://pypi.python.org/pypi/{0}" -f $mod
$name = "{0}.whl" -f $mod
$url = find-dynamic-url $dl_page $regex
download-file $path $name $url
}
## Extract ##
# 7-Zip
Write-Host "Extracting: 7-Zip"
try {
start "msiexec" -argumentlist @("/a", "$tmp\7z-installer.msi", "TARGETDIR=$tmp\7zi", "/qn") -wait
$sz = "$tmp\7zi\Files\7-Zip\7z.exe"
start $sz -argumentlist @("x", "$tmp\7z-extra.7z", "-o$bin\7-Zip", "-aoa", "-bso0", "-bse0", "-bsp0", "-x!x64\*.dll", "-x!Far", "-x!*.dll") -nonewwindow -wait
Start-Sleep 1
Move-Item "$bin\7-Zip\x64\7za.exe" "$bin\7-Zip\7za64.exe"
Remove-Item "$bin\7-Zip\x64" -Recurse
Remove-Item "$tmp\7z*" -Recurse
$sz = "$bin\7-Zip\7za.exe"
}
catch {
Write-Host (" ERROR: Failed to extract files." ) -foregroundcolor "Red"
}
# Notepad++
Write-Host "Extracting: Notepad++"
try {
start $sz -argumentlist @("x", "$tmp\npp.7z", "-o$bin\NotepadPlusPlus", "-aoa", "-bso0", "-bse0", "-bsp0") -nonewwindow -wait
Remove-Item "$tmp\npp.7z"
Move-Item "$bin\NotepadPlusPlus\notepad++.exe" "$bin\NotepadPlusPlus\notepadplusplus.exe"
}
catch {
Write-Host (" ERROR: Failed to extract files." ) -foregroundcolor "Red"
}
# ConEmu
Write-Host "Extracting: ConEmu"
try {
start $sz -argumentlist @("x", "$tmp\ConEmuPack.7z", "-o$bin\ConEmu", "-aoa", "-bso0", "-bse0", "-bsp0") -nonewwindow -wait
Remove-Item "$tmp\ConEmuPack.7z"
}
catch {
Write-Host (" ERROR: Failed to extract files." ) -foregroundcolor "Red"
}
# Python x32
Write-Host "Extracting: Python (x32)"
try {
foreach ($file in @("python32.zip", "certifi.whl", "chardet.whl", "idna.whl", "psutil32.whl", "requests.whl", "urllib3.whl")) {
start $sz -argumentlist @("x", "$tmp\$file", "-o$bin\Python\x32", "-aoa", "-bso0", "-bse0", "-bsp0") -nonewwindow -wait
}
}
catch {
Write-Host (" ERROR: Failed to extract files." ) -foregroundcolor "Red"
}
# Python x64
Write-Host "Extracting: Python (x64)"
try {
foreach ($file in @("python64.zip", "certifi.whl", "chardet.whl", "idna.whl", "psutil64.whl", "requests.whl", "urllib3.whl")) {
start $sz -argumentlist @("x", "$tmp\$file", "-o$bin\Python\x64", "-aoa", "-bso0", "-bse0", "-bsp0") -nonewwindow -wait
}
Remove-Item "$tmp\python*.zip"
Remove-Item "$tmp\*.whl"
}
catch {
Write-Host (" ERROR: Failed to extract files." ) -foregroundcolor "Red"
}
## Configure ##
Write-Host "Configuring kit"
wk_pause "Press Enter to open settings..."
start "$bin\NotepadPlusPlus\notepadplusplus.exe" -argumentlist @("$bin\Scripts\settings\main.py") -wait
Start-Sleep 1
## Done ##
popd
if ($errors -gt 0) {
wk_pause "Press Enter to exit..."
} else {
start "$bin\ConEmu\ConEmu.exe" -argumentlist @("-run", "$bin\Python\x32\python.exe", "$bin\Scripts\update_kit.py", "-new_console:n") -verb Runas
}

View file

@ -1,42 +0,0 @@
# Wizard Kit: Backup CBS Logs and prep CBS temp data for deletion
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.cleanup import *
from functions.data import *
init_global_vars()
os.system('title {}: CBS Cleanup'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\CBS Cleanup.log'.format(**global_vars)
if __name__ == '__main__':
try:
# Prep
stay_awake()
os.system('cls')
folder_path = r'{}\Backups'.format(KIT_NAME_SHORT)
dest = select_destination(folder_path=folder_path,
prompt='Which disk are we using for temp data and backup?')
# Show details
print_info('{}: CBS Cleanup Tool\n'.format(KIT_NAME_FULL))
show_info('Backup / Temp path:', dest)
print_standard('\n')
if (not ask('Proceed with CBS cleanup?')):
abort()
# Run Cleanup
try_and_print(message='Running cleanup...', function=cleanup_cbs,
cs='Done', dest_folder=dest)
# Done
print_standard('\nDone.')
pause("Press Enter to exit...")
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,56 +0,0 @@
# Wizard Kit: Check or repair the %SYSTEMDRIVE% filesystem via CHKDSK
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.repairs import *
init_global_vars()
os.system('title {}: Check Disk Tool'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\Check Disk.log'.format(**global_vars)
if __name__ == '__main__':
try:
stay_awake()
os.system('cls')
other_results = {
'Error': {
'CalledProcessError': 'Unknown Error',
},
'Warning': {
'GenericRepair': 'Repaired',
'UnsupportedOSError': 'Unsupported OS',
}}
options = [
{'Name': 'Run CHKDSK scan (read-only)', 'Repair': False},
{'Name': 'Schedule CHKDSK scan (offline repair)', 'Repair': True}]
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
selection = menu_select(
'{}: Check Disk Menu\n'.format(KIT_NAME_FULL),
main_entries=options,
action_entries=actions)
print_info('{}: Check Disk Menu\n'.format(KIT_NAME_FULL))
if selection == 'Q':
abort()
elif selection.isnumeric():
repair = options[int(selection)-1]['Repair']
if repair:
cs = 'Scheduled'
else:
cs = 'CS'
message = 'CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env'])
try_and_print(message=message, function=run_chkdsk,
cs=cs, other_results=other_results, repair=repair)
else:
abort()
# Done
print_success('Done.')
pause("Press Enter to exit...")
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,28 +0,0 @@
@echo off
setlocal enabledelayedexpansion
pushd "%~dp0"
rem Prep
mkdir _out\_Drivers
set "out=%cd%\_out"
rem _Drivers
pushd _Drivers
for %%f in (*) do (
set "file=%%f"
"%programfiles%\7-Zip\7z.exe" a -t7z -mx=9 -myx=9 -ms=on -mhe -pAbracadabra "%out%\_Drivers\!file:~0,-4!.7z" "%%f"
)
popd
rem Rest
for /d %%d in (*) do (
if not "%%d" == "_out" (
pushd "%%d"
"%programfiles%\7-Zip\7z.exe" a -t7z -mx=9 -myx=9 -ms=on -mhe -pAbracadabra "%out%\%%d.7z" *
popd
)
)
popd
endlocal

View file

@ -1,57 +0,0 @@
# Wizard Kit: Check or repair component store health via DISM
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.repairs import *
init_global_vars()
os.system('title {}: DISM helper Tool'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\DISM helper tool.log'.format(**global_vars)
if __name__ == '__main__':
try:
stay_awake()
os.system('cls')
other_results = {
'Error': {
'CalledProcessError': 'Unknown Error',
},
'Warning': {
'GenericRepair': 'Repaired',
'UnsupportedOSError': 'Unsupported OS',
}}
disabled = bool(global_vars['OS']['Version'] not in ['8', '10'])
options = [
{'Name': 'Check Health', 'Repair': False, 'Disabled': disabled},
{'Name': 'Restore Health', 'Repair': True, 'Disabled': disabled}]
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
selection = menu_select(
'{}: DISM Menu\n'.format(KIT_NAME_FULL),
main_entries=options,
action_entries=actions)
print_info('{}: DISM Menu\n'.format(KIT_NAME_FULL))
if selection == 'Q':
abort()
elif selection.isnumeric():
repair = options[int(selection)-1]['Repair']
if repair:
message='DISM RestoreHealth...'
else:
message='DISM ScanHealth...'
try_and_print(message=message, function=run_dism,
cs='No corruption', ns='Corruption detected',
other_results=other_results, repair=repair)
else:
abort()
# Done
print_success('Done.')
pause("Press Enter to exit...")
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,66 +0,0 @@
# Wizard Kit: Functions - Activation
import subprocess
from borrowed import acpi
from functions.common import *
from os import environ
# Variables
SLMGR = r'{}\System32\slmgr.vbs'.format(environ.get('SYSTEMROOT'))
def activate_with_bios():
"""Attempt to activate Windows with a key stored in the BIOS."""
# Code borrowed from https://github.com/aeruder/get_win8key
#####################################################
#script to query windows 8.x OEM key from PC firmware
#ACPI -> table MSDM -> raw content -> byte offset 56 to end
#ck, 03-Jan-2014 (christian@korneck.de)
#####################################################
bios_key = None
table = b"MSDM"
if acpi.FindAcpiTable(table) is True:
rawtable = acpi.GetAcpiTable(table)
#http://msdn.microsoft.com/library/windows/hardware/hh673514
#byte offset 36 from beginning \
# = Microsoft 'software licensing data structure' \
# / 36 + 20 bytes offset from beginning = Win Key
bios_key = rawtable[56:len(rawtable)].decode("utf-8")
if bios_key is None:
raise BIOSKeyNotFoundError
# Install Key
cmd = ['cscript', '//nologo', SLMGR, '/ipk', bios_key]
subprocess.run(cmd, check=False)
sleep(5)
# Attempt activation
cmd = ['cscript', '//nologo', SLMGR, '/ato']
subprocess.run(cmd, check=False)
sleep(5)
# Check status
if not windows_is_activated():
raise Exception('Activation Failed')
def get_activation_string():
"""Get activation status, returns str."""
act_str = subprocess.run(
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
act_str = act_str.stdout.decode()
act_str = act_str.splitlines()
act_str = act_str[1].strip()
return act_str
def windows_is_activated():
"""Check if Windows is activated via slmgr.vbs and return bool."""
activation_string = subprocess.run(
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
activation_string = activation_string.stdout.decode()
return bool(activation_string and 'permanent' in activation_string)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,447 +0,0 @@
# Wizard Kit: Functions - Browsers
from functions.common import *
# Define other_results for later try_and_print
browser_data = {}
other_results = {
'Error': {
'MultipleInstallationsError': 'Multiple installations detected',
},
'Warning': {
'NotInstalledError': 'Not installed',
'NoProfilesError': 'No profiles found',
}
}
# Regex
REGEX_BACKUP = re.compile(
r'\.\w+bak.*',
re.IGNORECASE)
REGEX_CHROMIUM_PROFILE = re.compile(
r'^(Default|Profile)',
re.IGNORECASE)
REGEX_CHROMIUM_ITEMS = re.compile(
r'^(Bookmarks|Cookies|Favicons|Google Profile'
r'|History|Login Data|Top Sites|TransportSecurity'
r'|Visited Links|Web Data)',
re.IGNORECASE)
REGEX_MOZILLA = re.compile(
r'^(bookmarkbackups|(cookies|formhistory|places).sqlite'
r'|key3.db|logins.json|persdict.dat)$',
re.IGNORECASE)
# STATIC VARIABLES
DEFAULT_HOMEPAGE = 'https://www.google.com/'
IE_GALLERY = 'https://www.microsoft.com/en-us/iegallery'
MOZILLA_PREFS = {
'browser.search.defaultenginename': '"Google"',
'browser.search.defaultenginename.US': '"Google"',
'browser.search.geoSpecificDefaults': 'false',
'browser.startup.homepage': '"{}"'.format(DEFAULT_HOMEPAGE),
'extensions.ui.lastCategory': '"addons://list/extension"',
}
UBO_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en'
UBO_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm'
UBO_EXTRA_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin-extra/pgdnlhfefecpicbbihgmbmffkjpaplco?hl=en'
UBO_EXTRA_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco'
UBO_MOZILLA = 'https://addons.mozilla.org/en-us/firefox/addon/ublock-origin/'
UBO_OPERA = 'https://addons.opera.com/en/extensions/details/ublock/?display=en'
SUPPORTED_BROWSERS = {
'Internet Explorer': {
'base': 'ie',
'exe_name': 'iexplore.exe',
'rel_install_path': 'Internet Explorer',
'user_data_path': r'{USERPROFILE}\Favorites',
},
'Google Chrome': {
'base': 'chromium',
'exe_name': 'chrome.exe',
'rel_install_path': r'Google\Chrome\Application',
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome\User Data',
},
'Google Chrome Canary': {
'base': 'chromium',
'exe_name': 'chrome.exe',
'rel_install_path': r'Google\Chrome SxS\Application',
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome SxS\User Data',
},
'Mozilla Firefox': {
'base': 'mozilla',
'exe_name': 'firefox.exe',
'rel_install_path': 'Mozilla Firefox',
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
},
'Mozilla Firefox Dev': {
'base': 'mozilla',
'exe_name': 'firefox.exe',
'rel_install_path': 'Firefox Developer Edition',
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
},
'Opera': {
'base': 'chromium',
'exe_name': 'launcher.exe',
'rel_install_path': 'Opera',
'user_data_path': r'{APPDATA}\Opera Software\Opera Stable',
},
'Opera Beta': {
'base': 'chromium',
'exe_name': 'launcher.exe',
'rel_install_path': 'Opera beta',
'user_data_path': r'{APPDATA}\Opera Software\Opera Next',
},
'Opera Dev': {
'base': 'chromium',
'exe_name': 'launcher.exe',
'rel_install_path': 'Opera developer',
'user_data_path': r'{APPDATA}\Opera Software\Opera Developer',
},
}
def archive_browser(name):
"""Create backup of Browser saved in the BackupDir."""
source = '{}*'.format(browser_data[name]['user_data_path'])
dest = r'{BackupDir}\Browsers ({USERNAME})'.format(
**global_vars, **global_vars['Env'])
archive = r'{}\{}.7z'.format(dest, name)
os.makedirs(dest, exist_ok=True)
cmd = [
global_vars['Tools']['SevenZip'],
'a', '-aoa', '-bso0', '-bse0', '-mx=1',
archive, source]
run_program(cmd)
def backup_browsers():
"""Create backup of all detected browsers."""
for name in sorted(browser_data):
try_and_print(message='{}...'.format(name),
function=archive_browser, name=name)
def clean_chromium_profile(profile):
"""Renames profile, creates a new folder, and copies the user data to it."""
if profile is None:
raise Exception
backup_path = '{path}_{Date}.bak'.format(
path=profile['path'], **global_vars)
backup_path = non_clobber_rename(backup_path)
shutil.move(profile['path'], backup_path)
os.makedirs(profile['path'], exist_ok=True)
# Restore essential files from backup_path
for entry in os.scandir(backup_path):
if REGEX_CHROMIUM_ITEMS.search(entry.name):
shutil.copy(entry.path, r'{}\{}'.format(
profile['path'], entry.name))
def clean_internet_explorer(**kwargs):
"""Uses the built-in function to reset IE and sets the homepage.
NOTE: kwargs set but unused as a workaround."""
kill_process('iexplore.exe')
run_program(['rundll32.exe', 'inetcpl.cpl,ResetIEtoDefaults'], check=False)
key = r'Software\Microsoft\Internet Explorer\Main'
# Set homepage
with winreg.OpenKey(HKCU, key, access=winreg.KEY_WRITE) as _key:
winreg.SetValueEx(_key, 'Start Page', 0,
winreg.REG_SZ, DEFAULT_HOMEPAGE)
try:
winreg.DeleteValue(_key, 'Secondary Start Pages')
except FileNotFoundError:
pass
def clean_mozilla_profile(profile):
"""Renames profile, creates a new folder, and copies the user data to it."""
if profile is None:
raise Exception
backup_path = '{path}_{Date}.bak'.format(
path=profile['path'], **global_vars)
backup_path = non_clobber_rename(backup_path)
shutil.move(profile['path'], backup_path)
homepages = []
os.makedirs(profile['path'], exist_ok=True)
# Restore essential files from backup_path
for entry in os.scandir(backup_path):
if REGEX_MOZILLA.search(entry.name):
if entry.is_dir():
shutil.copytree(entry.path, r'{}\{}'.format(
profile['path'], entry.name))
else:
shutil.copy(entry.path, r'{}\{}'.format(
profile['path'], entry.name))
# Set profile defaults
with open(r'{path}\prefs.js'.format(**profile), 'a', encoding='ascii') as f:
for k, v in MOZILLA_PREFS.items():
f.write('user_pref("{}", {});\n'.format(k, v))
def get_browser_details(name):
"""Get installation status and profile details for all supported browsers."""
browser = SUPPORTED_BROWSERS[name].copy()
# Update user_data_path
browser['user_data_path'] = browser['user_data_path'].format(
**global_vars['Env'])
# Find executable (if multiple files are found, the last one is used)
exe_path = None
num_installs = 0
for install_path in ['LOCALAPPDATA', 'PROGRAMFILES(X86)', 'PROGRAMFILES']:
test_path = r'{install_path}\{rel_install_path}\{exe_name}'.format(
install_path = global_vars['Env'].get(install_path, ''),
**browser)
if os.path.exists(test_path):
num_installs += 1
exe_path = test_path
# Find profile(s)
profiles = []
if browser['base'] == 'ie':
profiles.append({'name': 'Default', 'path': None})
elif 'Google Chrome' in name:
profiles.extend(
get_chromium_profiles(
search_path=browser['user_data_path']))
elif browser['base'] == 'mozilla':
dev = 'Dev' in name
profiles.extend(
get_mozilla_profiles(
search_path=browser['user_data_path'], dev=dev))
if exe_path and not dev and len(profiles) == 0:
# e.g. If Firefox is installed but no profiles were found.
## Rename profiles.ini and create a new default profile
profiles_ini_path = browser['user_data_path'].replace(
'Profiles', 'profiles.ini')
if os.path.exists(profiles_ini_path):
backup_path = '{path}_{Date}.bak'.format(
path=profiles_ini_path, **global_vars)
backup_path = non_clobber_rename(backup_path)
shutil.move(profiles_ini_path, backup_path)
run_program([exe_path, '-createprofile', 'default'], check=False)
profiles.extend(
get_mozilla_profiles(
search_path=browser['user_data_path'], dev=dev))
elif 'Opera' in name:
if os.path.exists(browser['user_data_path']):
profiles.append(
{'name': 'Default', 'path': browser['user_data_path']})
# Skip browser if there's no profiles
if len(profiles) == 0:
raise NoProfilesError
# Get homepages
if browser['base'] == 'ie':
# IE is set to only have one profile above
profiles[0]['homepages'] = get_ie_homepages()
elif browser['base'] == 'mozilla':
for profile in profiles:
prefs_path = r'{path}\prefs.js'.format(**profile)
profile['homepages'] = get_mozilla_homepages(prefs_path=prefs_path)
# Add to browser_data
browser_data[name] = browser
browser_data[name].update({
'exe_path': exe_path,
'profiles': profiles,
})
# Raise installation warnings (if any)
if num_installs == 0:
raise NotInstalledError
elif num_installs > 1 and browser['base'] != 'ie':
raise MultipleInstallationsError
def get_chromium_profiles(search_path):
"""Find any chromium-style profiles and return as a list of dicts."""
profiles = []
try:
for entry in os.scandir(search_path):
if entry.is_dir() and REGEX_CHROMIUM_PROFILE.search(entry.name):
profiles.append(entry)
REGEX_PROFILE_BACKUP = r'\.\w+bak.*'
profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)]
# Convert os.DirEntries to dicts
profiles = [{'name': p.name, 'path': p.path} for p in profiles]
except Exception:
pass
return profiles
def get_ie_homepages():
"""Read homepages from the registry and return as a list."""
homepages = []
main_page = ''
extra_pages = []
key = r'Software\Microsoft\Internet Explorer\Main'
with winreg.OpenKey(HKCU, key) as _key:
try:
main_page = winreg.QueryValueEx(_key, 'Start Page')[0]
except FileNotFoundError:
pass
try:
extra_pages = winreg.QueryValueEx(_key, 'Secondary Start Pages')[0]
except FileNotFoundError:
pass
if main_page != '':
homepages.append(main_page)
if len(extra_pages) > 0:
homepages.extend(extra_pages)
return homepages
def get_mozilla_homepages(prefs_path):
"""Read homepages from prefs.js and return as a list."""
homepages = []
try:
with open(prefs_path, 'r') as f:
search = re.search(
r'browser\.startup\.homepage", "([^"]*)"',
f.read(), re.IGNORECASE)
if search:
homepages = search.group(1).split('|')
except Exception:
pass
return homepages
def get_mozilla_profiles(search_path, dev=False):
"""Find any mozilla-style profiles and return as a list of dicts."""
profiles = []
try:
for entry in os.scandir(search_path):
if entry.is_dir():
if 'dev-edition' in entry.name:
# NOTE: Not always present which can lead
# to Dev profiles being marked as non-Dev
## NOTE 2: It is possible that a non-Dev profile
## to be created with 'dev-edition' in the name.
## (It wouldn't make sense, but possible)
if dev:
profiles.append(entry)
elif not dev:
profiles.append(entry)
profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)]
# Convert os.DirEntries to dicts
profiles = [{'name': p.name, 'path': p.path} for p in profiles]
except Exception:
pass
return profiles
def install_adblock(indent=8, width=32):
"""Install adblock for all supported browsers."""
for browser in sorted(browser_data):
exe_path = browser_data[browser].get('exe_path', None)
function=run_program
if exe_path is None:
print_standard(
'{indent}{browser:<{width}}'.format(
indent=' '*indent, width=width, browser=browser+'...'),
end='', flush=True)
print_warning('Not installed', timestamp=False)
else:
# Set urls to open
urls = []
if browser_data[browser]['base'] == 'chromium':
if browser == 'Google Chrome':
# Check for system exensions
try:
winreg.QueryValue(HKLM, UBO_CHROME_REG)
except FileNotFoundError:
urls.append(UBO_CHROME)
try:
winreg.QueryValue(HKLM, UBO_EXTRA_CHROME_REG)
except FileNotFoundError:
urls.append(UBO_EXTRA_CHROME)
if len(urls) == 0:
urls = ['chrome://extensions']
elif 'Opera' in browser:
urls.append(UBO_OPERA)
else:
urls.append(UBO_CHROME)
urls.append(UBO_EXTRA_CHROME)
elif browser_data[browser]['base'] == 'mozilla':
# Assume UBO is not installed first and change if it is
urls.append(UBO_MOZILLA)
if browser == 'Mozilla Firefox':
ubo = browser_data[browser]['exe_path'].replace(
'firefox.exe',
r'distribution\extensions\uBlock0@raymondhill.net')
if os.path.exists(ubo):
urls = ['about:addons']
elif browser_data[browser]['base'] == 'ie':
urls.append(IE_GALLERY)
function=popen_program
# By using check=False we're skipping any return codes so
# it should only fail if the program can't be run
# (or can't be found).
# In other words, this isn't tracking the addon/extension's
# installation status.
try_and_print(message='{}...'.format(browser),
indent=indent, width=width,
cs='Done', function=function,
cmd=[exe_path, *urls], check=False)
def list_homepages(indent=8, width=32):
"""List current homepages for reference."""
for browser in sorted(browser_data):
# Skip Chromium-based browsers
if browser_data[browser]['base'] == 'chromium':
print_info(
'{indent}{browser:<{width}}'.format(
indent=' '*indent, width=width, browser=browser+'...'),
end='', flush=True)
print_warning('Not implemented', timestamp=False)
continue
# All other browsers
profiles = browser_data[browser].get('profiles', [])
if profiles:
print_info('{indent}{browser:<{width}}'.format(
indent=' '*indent, width=width, browser=browser+'...'))
for profile in profiles:
_name = profile.get('name', '?')
_homepages = profile.get('homepages', [])
if len(_homepages) == 0:
print_standard(
'{indent}{name:<{width}}'.format(
indent=' '*indent, width=width, name=_name),
end='', flush=True)
print_warning('None found', timestamp=False)
else:
for page in _homepages:
print_standard('{indent}{name:<{width}}{page}'.format(
indent=' '*indent, width=width, name=_name, page=page))
def reset_browsers(indent=8, width=32):
"""Reset all detected browsers to safe defaults."""
for browser in sorted(browser_data):
print_info('{indent}{name}'.format(indent=' '*indent, name=browser))
for profile in browser_data[browser]['profiles']:
if browser_data[browser]['base'] == 'chromium':
function = clean_chromium_profile
elif browser_data[browser]['base'] == 'ie':
function = clean_internet_explorer
elif browser_data[browser]['base'] == 'mozilla':
function = clean_mozilla_profile
try_and_print(
message='{}...'.format(profile['name']),
indent=indent, width=width, function=function,
other_results=other_results, profile=profile)
def scan_for_browsers():
"""Scan system for any supported browsers."""
for name in sorted(SUPPORTED_BROWSERS):
try_and_print(message='{}...'.format(name),
function=get_browser_details, cs='Detected',
other_results=other_results, name=name)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,91 +0,0 @@
# Wizard Kit: Functions - Cleanup
from functions.common import *
def cleanup_adwcleaner():
"""Move AdwCleaner folders into the ClientDir."""
source_path = r'{SYSTEMDRIVE}\AdwCleaner'.format(**global_vars['Env'])
source_quarantine = r'{}\Quarantine'.format(source_path)
# Quarantine
if os.path.exists(source_quarantine):
os.makedirs(global_vars['QuarantineDir'], exist_ok=True)
dest_name = r'{QuarantineDir}\AdwCleaner_{Date-Time}'.format(
**global_vars)
dest_name = non_clobber_rename(dest_name)
shutil.move(source_quarantine, dest_name)
# Delete source folder if empty
try:
os.rmdir(source_path)
except OSError:
pass
# Main folder
if os.path.exists(source_path):
os.makedirs(global_vars['ProgBackupDir'], exist_ok=True)
dest_name = r'{ProgBackupDir}\AdwCleaner_{Date-Time}'.format(
**global_vars)
dest_name = non_clobber_rename(dest_name)
shutil.move(source_path, dest_name)
def cleanup_cbs(dest_folder):
"""Safely cleanup a known CBS archive bug under Windows 7.
If a CbsPersist file is larger than 2 Gb then the auto archive feature
continually fails and will fill up the system drive with temp files.
This function moves the temp files and CbsPersist file to a temp folder,
compresses the CbsPersist files with 7-Zip, and then opens the temp folder
for the user to manually save the backup files and delete the temp files.
"""
backup_folder = r'{dest_folder}\CbsFix'.format(dest_folder=dest_folder)
temp_folder = r'{backup_folder}\Temp'.format(backup_folder=backup_folder)
os.makedirs(backup_folder, exist_ok=True)
os.makedirs(temp_folder, exist_ok=True)
# Move files into temp folder
cbs_path = r'{SYSTEMROOT}\Logs\CBS'.format(**global_vars['Env'])
for entry in os.scandir(cbs_path):
# CbsPersist files
if entry.name.lower().startswith('cbspersist'):
dest_name = r'{}\{}'.format(temp_folder, entry.name)
dest_name = non_clobber_rename(dest_name)
shutil.move(entry.path, dest_name)
temp_path = r'{SYSTEMROOT}\Temp'.format(**global_vars['Env'])
for entry in os.scandir(temp_path):
# cab_ files
if entry.name.lower().startswith('cab_'):
dest_name = r'{}\{}'.format(temp_folder, entry.name)
dest_name = non_clobber_rename(dest_name)
shutil.move(entry.path, dest_name)
# Compress CbsPersist files with 7-Zip
cmd = [
global_vars['Tools']['SevenZip'],
'a', '-t7z', '-mx=3', '-bso0', '-bse0',
r'{}\CbsPersists.7z'.format(backup_folder),
r'{}\CbsPersist*'.format(temp_folder)]
run_program(cmd)
def cleanup_desktop():
"""Move known backup files and reports into the ClientDir."""
dest_folder = r'{ProgBackupDir}\Desktop_{Date-Time}'.format(**global_vars)
os.makedirs(dest_folder, exist_ok=True)
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
for entry in os.scandir(desktop_path):
# JRT, RKill, Shortcut cleaner
if re.search(r'^(JRT|RKill|sc-cleaner)', entry.name, re.IGNORECASE):
dest_name = r'{}\{}'.format(dest_folder, entry.name)
dest_name = non_clobber_rename(dest_name)
shutil.move(entry.path, dest_name)
# Remove dir if empty
try:
os.rmdir(dest_folder)
except OSError:
pass
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,685 +0,0 @@
# Wizard Kit: Functions - Common
import os
import psutil
import re
import shutil
import subprocess
import sys
import time
import traceback
import winreg
from subprocess import CalledProcessError
from settings.main import *
from settings.tools import *
# Global variables
global_vars = {}
# STATIC VARIABLES
COLORS = {
'CLEAR': '\033[0m',
'RED': '\033[31m',
'GREEN': '\033[32m',
'YELLOW': '\033[33m',
'BLUE': '\033[34m'
}
HKU = winreg.HKEY_USERS
HKCU = winreg.HKEY_CURRENT_USER
HKLM = winreg.HKEY_LOCAL_MACHINE
# Error Classes
class BIOSKeyNotFoundError(Exception):
pass
class BinNotFoundError(Exception):
pass
class GenericError(Exception):
pass
class GenericRepair(Exception):
pass
class MultipleInstallationsError(Exception):
pass
class NotInstalledError(Exception):
pass
class NoProfilesError(Exception):
pass
class PathNotFoundException(Exception):
pass
class UnsupportedOSError(Exception):
pass
# General functions
def abort():
"""Abort script."""
print_warning('Aborted.')
sleep(5)
exit_script()
def ask(prompt='Kotaero!'):
"""Prompt the user with a Y/N question, log answer, and return a bool."""
answer = None
prompt = '{} [Y/N]: '.format(prompt)
while answer is None:
tmp = input(prompt)
if re.search(r'^y(es|)$', tmp, re.IGNORECASE):
answer = True
elif re.search(r'^n(o|ope|)$', tmp, re.IGNORECASE):
answer = False
message = '{prompt}{answer_text}'.format(
prompt = prompt,
answer_text = 'Yes' if answer else 'No')
print_log(message=message)
return answer
def convert_to_bytes(size):
"""Convert human-readable size str to bytes and return an int."""
size = str(size)
tmp = re.search(r'(\d+)\s+([KMGT]B)', size.upper())
if tmp:
size = int(tmp.group(1))
units = tmp.group(2)
if units == 'TB':
size *= 1099511627776
elif units == 'GB':
size *= 1073741824
elif units == 'MB':
size *= 1048576
elif units == 'KB':
size *= 1024
else:
return -1
return size
def exit_script(return_value=0):
"""Exits the script after some cleanup and opens the log (if set)."""
# Remove dirs (if empty)
for dir in ['BackupDir', 'LogDir', 'TmpDir']:
try:
dir = global_vars[dir]
os.rmdir(dir)
except Exception:
pass
# Open Log (if it exists)
log = global_vars.get('LogFile', '')
if log and os.path.exists(log):
try:
extract_item('NotepadPlusPlus', silent=True)
popen_program(
[global_vars['Tools']['NotepadPlusPlus'],
global_vars['LogFile']])
except Exception:
print_error('ERROR: Failed to extract Notepad++ and open log.')
pause('Press Enter to exit...')
# Kill Caffeine if still running
kill_process('caffeine.exe')
# Exit
sys.exit(return_value)
def extract_item(item, filter='', silent=False):
"""Extract item from .cbin into .bin."""
cmd = [
global_vars['Tools']['SevenZip'], 'x', '-aos', '-bso0', '-bse0',
'-p{ArchivePassword}'.format(**global_vars),
r'-o{BinDir}\{item}'.format(item=item, **global_vars),
r'{CBinDir}\{item}.7z'.format(item=item, **global_vars),
filter]
if not silent:
print_standard('Extracting "{item}"...'.format(item=item))
try:
run_program(cmd)
except subprocess.CalledProcessError:
if not silent:
print_warning('WARNING: Errors encountered while exctracting data')
def get_ticket_number():
"""Get TicketNumber from user, save in LogDir, and return as str."""
ticket_number = None
while ticket_number is None:
_input = input('Enter ticket number: ')
if re.match(r'^([0-9]+([-_]?\w+|))$', _input):
ticket_number = _input
with open(r'{LogDir}\TicketNumber'.format(**global_vars), 'w') as f:
f.write(ticket_number)
return ticket_number
def human_readable_size(size, decimals=0):
"""Convert size in bytes to a human-readable format and return a str."""
# Prep string formatting
width = 3+decimals
if decimals > 0:
width += 1
# Convert size to int
try:
size = int(size)
except ValueError:
size = convert_to_bytes(size)
# Verify we have a valid size
if size <= 0:
return '{size:>{width}} b'.format(size='???', width=width)
# Convert to sensible units
if size >= 1099511627776:
size /= 1099511627776
units = 'Tb'
elif size >= 1073741824:
size /= 1073741824
units = 'Gb'
elif size >= 1048576:
size /= 1048576
units = 'Mb'
elif size >= 1024:
size /= 1024
units = 'Kb'
else:
units = ' b'
# Return
return '{size:>{width}.{decimals}f} {units}'.format(
size=size, width=width, decimals=decimals, units=units)
def kill_process(name):
"""Kill any running caffeine.exe processes."""
for proc in psutil.process_iter():
if proc.name() == name:
proc.kill()
def major_exception():
"""Display traceback and exit"""
print_error('Major exception')
print_warning(
" Please let {tech} know and they'll look into it"
" (include the details below).".format(tech=SUPPORT_TECH))
print(traceback.format_exc())
print_log(traceback.format_exc())
sleep(30)
pause('Press Enter to exit...')
# sys.exit(1)
exit_script(1)
def menu_select(title='~ Untitled Menu ~',
prompt='Please make a selection', secret_exit=False,
main_entries=[], action_entries=[], disabled_label='DISABLED'):
"""Display options in a menu and return selected option as a str."""
# Bail early
if not main_entries and not action_entries:
raise Exception("MenuError: No items given")
# Build menu
menu_splash = '{}\n\n'.format(title)
width = len(str(len(main_entries)))
valid_answers = []
if (secret_exit):
valid_answers.append('Q')
# Add main entries
for i in range(len(main_entries)):
entry = main_entries[i]
# Add Spacer
if ('CRLF' in entry):
menu_splash += '\n'
entry_str = '{number:>{width}}: {name}'.format(
number = i+1,
width = width,
name = entry.get('Display Name', entry['Name']))
if entry.get('Disabled', False):
entry_str = '{YELLOW}{entry_str} ({disabled}){CLEAR}'.format(
entry_str = entry_str,
disabled = disabled_label,
**COLORS)
else:
valid_answers.append(str(i+1))
menu_splash += '{}\n'.format(entry_str)
menu_splash += '\n'
# Add action entries
for entry in action_entries:
# Add Spacer
if ('CRLF' in entry):
menu_splash += '\n'
valid_answers.append(entry['Letter'])
menu_splash += '{letter:>{width}}: {name}\n'.format(
letter = entry['Letter'].upper(),
width = len(str(len(action_entries))),
name = entry['Name'])
menu_splash += '\n'
answer = ''
while (answer.upper() not in valid_answers):
os.system('cls')
print(menu_splash)
answer = input('{}: '.format(prompt))
return answer.upper()
def non_clobber_rename(full_path):
"""Append suffix to path, if necessary, to avoid clobbering path"""
new_path = full_path
_i = 1;
while os.path.exists(new_path):
new_path = '{path}_{i}'.format(i=_i, path=full_path)
_i += 1
return new_path
def pause(prompt='Press Enter to continue... '):
"""Simple pause implementation."""
input(prompt)
def ping(addr='google.com'):
"""Attempt to ping addr."""
cmd = ['ping', '-n', '2', addr]
run_program(cmd)
def popen_program(cmd, pipe=False, minimized=False, shell=False, **kwargs):
"""Run program and return a subprocess.Popen object."""
startupinfo=None
if minimized:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags = subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = 6
if pipe:
popen_obj = subprocess.Popen(cmd, shell=shell, startupinfo=startupinfo,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
else:
popen_obj = subprocess.Popen(cmd, shell=shell, startupinfo=startupinfo)
return popen_obj
def print_error(*args, **kwargs):
"""Prints message to screen in RED."""
print_standard(*args, color=COLORS['RED'], **kwargs)
def print_info(*args, **kwargs):
"""Prints message to screen in BLUE."""
print_standard(*args, color=COLORS['BLUE'], **kwargs)
def print_warning(*args, **kwargs):
"""Prints message to screen in YELLOW."""
print_standard(*args, color=COLORS['YELLOW'], **kwargs)
def print_standard(message='Generic info',
color=None, end='\n', timestamp=True, **kwargs):
"""Prints message to screen and log (if set)."""
display_message = message
if color:
display_message = color + message + COLORS['CLEAR']
# **COLORS is used below to support non-"standard" color printing
print(display_message.format(**COLORS), end=end, **kwargs)
print_log(message, end, timestamp)
def print_success(*args, **kwargs):
"""Prints message to screen in GREEN."""
print_standard(*args, color=COLORS['GREEN'], **kwargs)
def print_log(message='', end='\n', timestamp=True):
time_str = time.strftime("%Y-%m-%d %H%M%z: ") if timestamp else ''
if 'LogFile' in global_vars and global_vars['LogFile'] is not None:
with open(global_vars['LogFile'], 'a') as f:
for line in message.splitlines():
f.write('{timestamp}{line}{end}'.format(
timestamp = time_str,
line = line,
end = end))
def run_program(cmd, args=[], check=True, pipe=True, shell=False):
"""Run program and return a subprocess.CompletedProcess object."""
if args:
# Deprecated so let's raise an exception to find & fix all occurances
print_error('ERROR: Using args is no longer supported.')
raise Exception
cmd = [c for c in cmd if c]
if shell:
cmd = ' '.join(cmd)
if pipe:
process_return = subprocess.run(cmd, check=check, shell=shell,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
else:
process_return = subprocess.run(cmd, check=check, shell=shell)
return process_return
def show_info(message='~Some message~', info='~Some info~', indent=8, width=32):
"""Display info with formatting."""
print_standard('{indent}{message:<{width}}{info}'.format(
indent=' '*indent, width=width, message=message, info=info))
def sleep(seconds=2):
"""Wait for a while."""
time.sleep(seconds)
def stay_awake():
"""Prevent the system from sleeping or hibernating."""
# Bail if caffeine is already running
for proc in psutil.process_iter():
if proc.name() == 'caffeine.exe':
return
# Extract and run
extract_item('Caffeine', silent=True)
try:
popen_program(global_vars['Tools']['Caffeine'])
except Exception:
print_error('ERROR: No caffeine available.')
print_warning('Please set the power setting to High Performance.')
def get_exception(s):
"""Get exception by name, returns Exception object."""
return getattr(sys.modules[__name__], s)
def try_and_print(message='Trying...',
function=None, cs='CS', ns='NS', other_results={},
catch_all=True, print_return=False, silent_function=True,
indent=8, width=32, *args, **kwargs):
"""Run function, print if successful or not, and return dict.
other_results is in the form of
{
'Warning': {'ExceptionClassName': 'Result Message'},
'Error': {'ExceptionClassName': 'Result Message'}
}
The the ExceptionClassNames will be excepted conditions
and the result string will be printed in the correct color.
catch_all=False will result in unspecified exceptions being re-raised."""
err = None
w_exceptions = other_results.get('Warning', {}).keys()
w_exceptions = tuple(get_exception(e) for e in w_exceptions)
e_exceptions = other_results.get('Error', {}).keys()
e_exceptions = tuple(get_exception(e) for e in e_exceptions)
w_results = other_results.get('Warning', {})
e_results = other_results.get('Error', {})
# Run function and catch errors
print_standard('{indent}{message:<{width}}'.format(
indent=' '*indent, message=message, width=width), end='', flush=True)
try:
out = function(*args, **kwargs)
if print_return:
print_standard(out[0], timestamp=False)
for item in out[1:]:
print_standard('{indent}{item}'.format(
indent=' '*(indent+width), item=item))
elif silent_function:
print_success(cs, timestamp=False)
except w_exceptions as e:
_result = w_results.get(e.__class__.__name__, 'Warning')
print_warning(_result, timestamp=False)
err = e
except e_exceptions as e:
_result = e_results.get(e.__class__.__name__, 'Error')
print_error(_result, timestamp=False)
err = e
except Exception:
print_error(ns, timestamp=False)
err = traceback.format_exc()
# Return or raise?
if bool(err) and not catch_all:
raise
else:
return {'CS': not bool(err), 'Error': err}
def upload_data(path, file):
"""Add CLIENT_INFO_SERVER to authorized connections and upload file."""
if not ENABLED_UPLOAD_DATA:
raise GenericError('Feature disabled.')
extract_item('PuTTY', filter='wizkit.ppk psftp.exe', silent=True)
# Authorize connection to the server
winreg.CreateKey(HKCU, r'Software\SimonTatham\PuTTY\SshHostKeys')
with winreg.OpenKey(HKCU, r'Software\SimonTatham\PuTTY\SshHostKeys',
access=winreg.KEY_WRITE) as key:
winreg.SetValueEx(key,
'rsa2@22:{IP}'.format(**CLIENT_INFO_SERVER), 0,
winreg.REG_SZ, CLIENT_INFO_SERVER['RegEntry'])
# Write batch file
with open(r'{TmpDir}\psftp.batch'.format(**global_vars),
'w', encoding='ascii') as f:
f.write('lcd "{path}"\n'.format(path=path))
f.write('cd "{Share}"\n'.format(**CLIENT_INFO_SERVER))
f.write('mkdir {TicketNumber}\n'.format(**global_vars))
f.write('cd {TicketNumber}\n'.format(**global_vars))
f.write('put "{file}"\n'.format(file=file))
# Upload Info
cmd = [
global_vars['Tools']['PuTTY-PSFTP'],
'-noagent',
'-i', r'{BinDir}\PuTTY\wizkit.ppk'.format(**global_vars),
'{User}@{IP}'.format(**CLIENT_INFO_SERVER),
'-b', r'{TmpDir}\psftp.batch'.format(**global_vars)]
run_program(cmd)
def upload_info():
"""Upload compressed Info file to the NAS as set in settings.main.py."""
if not ENABLED_UPLOAD_DATA:
raise GenericError('Feature disabled.')
path = '{ClientDir}'.format(**global_vars)
file = 'Info_{Date-Time}.7z'.format(**global_vars)
upload_data(path, file)
def compress_info():
"""Compress ClientDir info folders with 7-Zip for upload_info()."""
path = '{ClientDir}'.format(**global_vars)
file = 'Info_{Date-Time}.7z'.format(**global_vars)
_cmd = [
global_vars['Tools']['SevenZip'],
'a', '-t7z', '-mx=9', '-bso0', '-bse0',
r'{}\{}'.format(path, file),
r'{ClientDir}\Info'.format(**global_vars)]
run_program(_cmd)
def wait_for_process(name, poll_rate=3):
"""Wait for process by name."""
running = True
while running:
sleep(poll_rate)
running = False
for proc in psutil.process_iter():
if re.search(r'^{}'.format(name), proc.name(), re.IGNORECASE):
running = True
sleep(1)
# global_vars functions
def init_global_vars():
"""Sets global variables based on system info."""
print_info('Initializing')
os.system('title Wizard Kit')
init_functions = [
['Checking .bin...', find_bin],
['Checking environment...', set_common_vars],
['Checking OS...', check_os],
['Checking tools...', check_tools],
['Creating folders...', make_tmp_dirs],
['Clearing collisions...', clean_env_vars],
]
try:
for f in init_functions:
try_and_print(
message=f[0], function=f[1],
cs='Done', ns='Error', catch_all=False)
except:
major_exception()
def check_os():
"""Set OS specific variables."""
tmp = {}
# Query registry
_reg_path = winreg.OpenKey(
HKLM, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion')
for key in ['CSDVersion', 'CurrentBuild', 'CurrentBuildNumber',
'CurrentVersion', 'ProductName']:
try:
tmp[key] = winreg.QueryValueEx(_reg_path, key)[0]
if key in ['CurrentBuild', 'CurrentBuildNumber']:
tmp[key] = int(tmp[key])
except ValueError:
# Couldn't convert Build to int so this should be interesting...
tmp[key] = 0
except Exception:
tmp[key] = 'Unknown'
# Determine OS bit depth
tmp['Arch'] = 32
if 'PROGRAMFILES(X86)' in global_vars['Env']:
tmp['Arch'] = 64
# Determine OS Name
tmp['Name'] = '{ProductName} {CSDVersion}'.format(**tmp)
if tmp['CurrentBuild'] == 9600:
tmp['Name'] += ' Update' # Win 8.1u
if tmp['CurrentBuild'] == 10240:
tmp['Name'] += ' Release 1507 "Threshold 1"'
if tmp['CurrentBuild'] == 10586:
tmp['Name'] += ' Release 1511 "Threshold 2"'
if tmp['CurrentBuild'] == 14393:
tmp['Name'] += ' Release 1607 "Redstone 1" / "Anniversary Update"'
if tmp['CurrentBuild'] == 15063:
tmp['Name'] += ' Release 1703 "Redstone 2" / "Creators Update"'
if tmp['CurrentBuild'] == 16299:
tmp['Name'] += ' Release 1709 "Redstone 3" / "Fall Creators Update"'
tmp['Name'] = tmp['Name'].replace('Service Pack ', 'SP')
tmp['Name'] = tmp['Name'].replace('Unknown Release', 'Release')
tmp['Name'] = re.sub(r'\s+', ' ', tmp['Name'])
# Determine OS version
name = '{Name} x{Arch}'.format(**tmp)
if tmp['CurrentVersion'] == '6.0':
tmp['Version'] = 'Vista'
name += ' (very outdated)'
elif tmp['CurrentVersion'] == '6.1':
tmp['Version'] = '7'
if tmp['CSDVersion'] == 'Service Pack 1':
name += ' (outdated)'
else:
name += ' (very outdated)'
elif tmp['CurrentVersion'] in ['6.2', '6.3']:
if int(tmp['CurrentBuildNumber']) <= 9600:
tmp['Version'] = '8'
elif int(tmp['CurrentBuildNumber']) >= 10240:
tmp['Version'] = '10'
if tmp['CurrentBuild'] in [9200, 10240, 10586]:
name += ' (very outdated)'
elif tmp['CurrentBuild'] in [9600, 14393, 15063]:
name += ' (outdated)'
elif tmp['CurrentBuild'] == 16299:
pass # Current Win10
else:
name += ' (unrecognized)'
tmp['DisplayName'] = name
# == vista ==
# 6.0.6000
# 6.0.6001
# 6.0.6002
# ==== 7 ====
# 6.1.7600
# 6.1.7601
# 6.1.7602
# ==== 8 ====
# 6.2.9200
# === 8.1 ===
# 6.3.9200
# === 8.1u ==
# 6.3.9600
# === 10 v1507 "Threshold 1" ==
# 6.3.10240
# === 10 v1511 "Threshold 2" ==
# 6.3.10586
# === 10 v1607 "Redstone 1" "Anniversary Update" ==
# 6.3.14393
# === 10 v1703 "Redstone 2" "Creators Update" ==
# 6.3.15063
# === 10 v1709 "Redstone 3" "Fall Creators Update" ==
# 6.3.16299
global_vars['OS'] = tmp
def check_tools():
"""Set tool variables based on OS bit-depth and tool availability."""
if global_vars['OS'].get('Arch', 32) == 64:
global_vars['Tools'] = {k: v.get('64', v.get('32'))
for (k, v) in TOOLS.items()}
else:
global_vars['Tools'] = {k: v.get('32') for (k, v) in TOOLS.items()}
# Fix paths
global_vars['Tools'] = {k: os.path.join(global_vars['BinDir'], v)
for (k, v) in global_vars['Tools'].items()}
def clean_env_vars():
"""Remove conflicting global_vars and env variables.
This fixes an issue where both global_vars and
global_vars['Env'] are expanded at the same time."""
for key in global_vars.keys():
global_vars['Env'].pop(key, None)
def find_bin():
"""Find .bin folder in the cwd or it's parents."""
wd = os.getcwd()
base = None
while base is None:
if os.path.exists('.bin'):
base = os.getcwd()
break
if re.fullmatch(r'\w:\\', os.getcwd()):
break
os.chdir('..')
os.chdir(wd)
if base is None:
raise BinNotFoundError
global_vars['BaseDir'] = base
def make_tmp_dirs():
"""Make temp directories."""
os.makedirs(global_vars['BackupDir'], exist_ok=True)
os.makedirs(global_vars['LogDir'], exist_ok=True)
os.makedirs(global_vars['TmpDir'], exist_ok=True)
def set_common_vars():
"""Set common variables."""
global_vars['Date'] = time.strftime("%Y-%m-%d")
global_vars['Date-Time'] = time.strftime("%Y-%m-%d_%H%M_%z")
global_vars['Env'] = os.environ.copy()
global_vars['ArchivePassword'] = ARCHIVE_PASSWORD
global_vars['BinDir'] = r'{BaseDir}\.bin'.format(
**global_vars)
global_vars['CBinDir'] = r'{BaseDir}\.cbin'.format(
**global_vars)
global_vars['ClientDir'] = r'{SYSTEMDRIVE}\{prefix}'.format(
prefix=KIT_NAME_SHORT, **global_vars['Env'])
global_vars['BackupDir'] = r'{ClientDir}\Backups\{Date}'.format(
**global_vars)
global_vars['LogDir'] = r'{ClientDir}\Info\{Date}'.format(
**global_vars)
global_vars['ProgBackupDir'] = r'{ClientDir}\Backups'.format(
**global_vars)
global_vars['QuarantineDir'] = r'{ClientDir}\Quarantine'.format(
**global_vars)
global_vars['TmpDir'] = r'{BinDir}\tmp'.format(
**global_vars)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,608 +0,0 @@
# Wizard Kit: Functions - Data
import ctypes
from operator import itemgetter
from functions.common import *
# Classes
class LocalDisk():
def __init__(self, disk):
self.disk = disk
self.name = disk.mountpoint.upper()
self.path = self.name
def is_dir(self):
# Should always be true
return True
# Regex
REGEX_EXCL_ITEMS = re.compile(
r'^(\.(AppleDB|AppleDesktop|AppleDouble'
r'|com\.apple\.timemachine\.supported|dbfseventsd'
r'|DocumentRevisions-V100.*|DS_Store|fseventsd|PKInstallSandboxManager'
r'|Spotlight.*|SymAV.*|symSchedScanLockxz|TemporaryItems|Trash.*'
r'|vol|VolumeIcon\.icns)|desktop\.(ini|.*DB|.*DF)'
r'|(hiberfil|pagefile)\.sys|lost\+found|Network\.*Trash\.*Folder'
r'|Recycle[dr]|System\.*Volume\.*Information|Temporary\.*Items'
r'|Thumbs\.db)$',
re.IGNORECASE)
REGEX_EXCL_ROOT_ITEMS = re.compile(
r'^\\?(boot(mgr|nxt)$|Config.msi'
r'|(eula|globdata|install|vc_?red)'
r'|.*.sys$|System Volume Information|RECYCLER?|\$Recycle\.bin'
r'|\$?Win(dows(.old.*|\.~BT|)$|RE_)|\$GetCurrent|Windows10Upgrade'
r'|PerfLogs|Program Files|SYSTEM.SAV'
r'|.*\.(esd|swm|wim|dd|map|dmg|image)$)',
re.IGNORECASE)
REGEX_INCL_ROOT_ITEMS = re.compile(
r'^\\?(AdwCleaner|(My\s*|)(Doc(uments?( and Settings|)|s?)|Downloads'
r'|Media|Music|Pic(ture|)s?|Vid(eo|)s?)'
r'|{prefix}(-?Info|-?Transfer|)'
r'|(ProgramData|Recovery|Temp.*|Users)$'
r'|.*\.(log|txt|rtf|qb\w*|avi|m4a|m4v|mp4|mkv|jpg|png|tiff?)$)'
r''.format(prefix=KIT_NAME_SHORT),
re.IGNORECASE)
REGEX_WIM_FILE = re.compile(
r'\.wim$',
re.IGNORECASE)
REGEX_WINDOWS_OLD = re.compile(
r'^\\Win(dows|)\.old',
re.IGNORECASE)
# STATIC VARIABLES
FAST_COPY_EXCLUDES = [
r'\*.esd',
r'\*.swm',
r'\*.wim',
r'\*.dd',
r'\*.dd.tgz',
r'\*.dd.txz',
r'\*.map',
r'\*.dmg',
r'\*.image',
r'$RECYCLE.BIN',
r'$Recycle.Bin',
r'.AppleDB',
r'.AppleDesktop',
r'.AppleDouble',
r'.com.apple.timemachine.supported',
r'.dbfseventsd',
r'.DocumentRevisions-V100*',
r'.DS_Store',
r'.fseventsd',
r'.PKInstallSandboxManager',
r'.Spotlight*',
r'.SymAV*',
r'.symSchedScanLockxz',
r'.TemporaryItems',
r'.Trash*',
r'.vol',
r'.VolumeIcon.icns',
r'desktop.ini',
r'Desktop?DB',
r'Desktop?DF',
r'hiberfil.sys',
r'lost+found',
r'Network?Trash?Folder',
r'pagefile.sys',
r'Recycled',
r'RECYCLER',
r'System?Volume?Information',
r'Temporary?Items',
r'Thumbs.db',
]
FAST_COPY_ARGS = [
'/cmd=noexist_only',
'/utf8',
'/skip_empty_dir',
'/linkdest',
'/no_ui',
'/auto_close',
'/exclude='+';'.join(FAST_COPY_EXCLUDES),
]
# Code borrowed from: https://stackoverflow.com/a/29075319
SEM_NORMAL = ctypes.c_uint()
SEM_FAILCRITICALERRORS = 1
SEM_NOOPENFILEERRORBOX = 0x8000
SEM_FAIL = SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS
def cleanup_transfer(dest_path):
"""Fix attributes and move extraneous items outside the Transfer folder."""
try:
# Remove dest_path if empty
os.rmdir(dest_path)
except OSError:
pass
if not os.path.exists(dest_path):
# Bail if dest_path was empty and removed
raise Exception
# Fix attributes
cmd = ['attrib', '-a', '-h', '-r', '-s', dest_path]
run_program(cmd, check=False)
for root, dirs, files in os.walk(dest_path, topdown=False):
for name in dirs:
# Remove empty directories and junction points
try:
os.rmdir(os.path.join(root, name))
except OSError:
pass
for name in files:
# "Remove" files based on exclusion regex
if REGEX_EXCL_ITEMS.search(name):
# Make dest folder
dest_name = root.replace(dest_path, dest_path+'.Removed')
os.makedirs(dest_name, exist_ok=True)
# Set dest filename
dest_name = os.path.join(dest_name, name)
dest_name = non_clobber_rename(dest_name)
source_name = os.path.join(root, name)
try:
shutil.move(source_name, dest_name)
except Exception:
pass
def is_valid_wim_file(item):
"""Checks if the provided os.DirEntry is a valid WIM file, returns bool."""
valid = bool(item.is_file() and REGEX_WIM_FILE.search(item.name))
if valid:
extract_item('wimlib', silent=True)
cmd = [global_vars['Tools']['wimlib-imagex'], 'info', item.path]
try:
run_program(cmd)
except subprocess.CalledProcessError:
valid = False
print_log('WARNING: Image "{}" damaged.'.format(item.name))
return valid
def mount_backup_shares():
"""Mount the backup shares unless labeled as already mounted."""
for server in BACKUP_SERVERS:
# Blindly skip if we mounted earlier
if server['Mounted']:
continue
mount_network_share(server)
def mount_network_share(server):
"""Mount a network share defined by server."""
# Test connection
try:
ping(server['IP'])
except subprocess.CalledProcessError:
print_error(
r'Failed to mount \\{Name}\{Share}, {IP} unreachable.'.format(
**server))
sleep(1)
return False
# Mount
cmd = r'net use \\{IP}\{Share} /user:{User} {Pass}'.format(**server)
cmd = cmd.split(' ')
try:
run_program(cmd)
except Exception:
print_warning(r'Failed to mount \\{Name}\{Share} ({IP})'.format(
**server))
sleep(1)
else:
print_info('Mounted {Name}'.format(**server))
server['Mounted'] = True
def run_fast_copy(items, dest):
"""Copy items to dest using FastCopy."""
if not items:
raise Exception
cmd = [global_vars['Tools']['FastCopy'], *FAST_COPY_ARGS]
if 'LogFile' in global_vars:
cmd.append('/logfile={LogFile}'.format(**global_vars))
cmd.extend(items)
cmd.append('/to={}\\'.format(dest))
run_program(cmd)
def run_wimextract(source, items, dest):
"""Extract items from source WIM to dest folder."""
if not items:
raise Exception
extract_item('wimlib', silent=True)
# Write files.txt
with open(r'{TmpDir}\wim_files.txt'.format(**global_vars), 'w') as f:
# Defaults
for item in items:
f.write('{item}\n'.format(item=item))
sleep(1) # For safety?
# Extract files
cmd = [
global_vars['Tools']['wimlib-imagex'],
'extract',
source, '1',
r'@{TmpDir}\wim_files.txt'.format(**global_vars),
'--dest-dir={}\\'.format(dest),
'--no-acls',
'--nullglob']
run_program(cmd)
def scan_source(source_obj, dest_path):
"""Scan source for files/folders to transfer."""
selected_items = []
if source_obj.is_dir():
# File-Based
print_standard('Scanning source (folder): {}'.format(source_obj.path))
selected_items = scan_source_path(source_obj.path, dest_path)
else:
# Image-Based
if REGEX_WIM_FILE.search(source_obj.name):
print_standard('Scanning source (image): {}'.format(
source_obj.path))
selected_items = scan_source_wim(source_obj.path, dest_path)
else:
print_error('ERROR: Unsupported image: {}'.format(
source_obj.path))
raise GenericError
return selected_items
def scan_source_path(source_path, dest_path, rel_path=None, interactive=True):
"""Scan source folder for files/folders to transfer.
This will scan the root and (recursively) any Windows.old folders."""
rel_path = '\\' + rel_path if rel_path else ''
if rel_path:
dest_path = dest_path + rel_path
selected_items = []
win_olds = []
# Root items
root_items = []
for item in os.scandir(source_path):
if REGEX_INCL_ROOT_ITEMS.search(item.name):
root_items.append(item.path)
elif not REGEX_EXCL_ROOT_ITEMS.search(item.name):
if (not interactive
or ask('Copy: "{}{}" ?'.format(rel_path, item.name))):
root_items.append(item.path)
if REGEX_WINDOWS_OLD.search(item.name):
win_olds.append(item)
if root_items:
selected_items.append({
'Message': '{}Root Items...'.format(rel_path),
'Items': root_items.copy(),
'Destination': dest_path})
# Fonts
if os.path.exists(r'{}\Windows\Fonts'.format(source_path)):
selected_items.append({
'Message': '{}Fonts...'.format(rel_path),
'Items': [r'{}\Windows\Fonts'.format(rel_path)],
'Destination': r'{}\Windows'.format(dest_path)})
# Registry
registry_items = []
for folder in ['config', 'OEM']:
folder = r'Windows\System32\{}'.format(folder)
folder = os.path.join(source_path, folder)
if os.path.exists(folder):
registry_items.append(folder)
if registry_items:
selected_items.append({
'Message': '{}Registry...'.format(rel_path),
'Items': registry_items.copy(),
'Destination': r'{}\Windows\System32'.format(dest_path)})
# Windows.old(s)
for old in win_olds:
selected_items.append(
scan_source_path(
old.path, dest_path, rel_path=old.name, interactive=False))
# Done
return selected_items
def scan_source_wim(source_wim, dest_path, rel_path=None, interactive=True):
"""Scan source WIM file for files/folders to transfer.
This will scan the root and (recursively) any Windows.old folders."""
rel_path = '\\' + rel_path if rel_path else ''
selected_items = []
win_olds = []
# Scan source
extract_item('wimlib', silent=True)
cmd = [
global_vars['Tools']['wimlib-imagex'], 'dir',
source_wim, '1']
try:
file_list = run_program(cmd)
except subprocess.CalledProcessError:
print_error('ERROR: Failed to get file list.')
raise
# Root Items
file_list = [i.strip()
for i in file_list.stdout.decode('utf-8', 'ignore').splitlines()
if i.count('\\') == 1 and i.strip() != '\\']
root_items = []
if rel_path:
file_list = [i.replace(rel_path, '') for i in file_list]
for item in file_list:
if REGEX_INCL_ROOT_ITEMS.search(item):
root_items.append(item)
elif not REGEX_EXCL_ROOT_ITEMS.search(item):
if (not interactive
or ask('Extract: "{}{}" ?'.format(rel_path, item))):
root_items.append('{}{}'.format(rel_path, item))
if REGEX_WINDOWS_OLD.search(item):
win_olds.append(item)
if root_items:
selected_items.append({
'Message': '{}Root Items...'.format(rel_path),
'Items': root_items.copy(),
'Destination': dest_path})
# Fonts
if wim_contains(source_wim, r'{}Windows\Fonts'.format(rel_path)):
selected_items.append({
'Message': '{}Fonts...'.format(rel_path),
'Items': [r'{}\Windows\Fonts'.format(rel_path)],
'Destination': dest_path})
# Registry
registry_items = []
for folder in ['config', 'OEM']:
folder = r'{}Windows\System32\{}'.format(rel_path, folder)
if wim_contains(source_wim, folder):
registry_items.append(folder)
if registry_items:
selected_items.append({
'Message': '{}Registry...'.format(rel_path),
'Items': registry_items.copy(),
'Destination': dest_path})
# Windows.old(s)
for old in win_olds:
scan_source_wim(source_wim, dest_path, rel_path=old, interactive=False)
# Done
return selected_items
def select_destination(folder_path, prompt='Select destination'):
"""Select destination drive, returns path as string."""
disk = select_disk(prompt)
if 'fixed' not in disk['Disk'].opts:
folder_path = folder_path.replace('\\', '-')
path = '{disk}{folder_path}_{Date}'.format(
disk = disk['Disk'].mountpoint,
folder_path = folder_path,
**global_vars)
# Avoid merging with existing folder
path = non_clobber_rename(path)
os.makedirs(path, exist_ok=True)
return path
def select_disk(title='Select disk', auto_select=True):
"""Select disk from attached disks. returns dict."""
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
disks = []
# Build list of disks
set_thread_error_mode(silent=True) # Prevents "No disk" popups
for d in psutil.disk_partitions():
info = {
'Disk': d,
'Name': d.mountpoint}
try:
usage = psutil.disk_usage(d.device)
free = '{free} / {total} available'.format(
free = human_readable_size(usage.free, 2),
total = human_readable_size(usage.total, 2))
except Exception:
# Meh, leaving unsupported destinations out
pass
# free = 'Unknown'
# info['Disabled'] = True
else:
info['Display Name'] = '{} ({})'.format(info['Name'], free)
disks.append(info)
set_thread_error_mode(silent=False) # Return to normal
# Skip menu?
if len(disks) == 1 and auto_select:
return disks[0]
# Show menu
selection = menu_select(title, main_entries=disks, action_entries=actions)
if selection == 'Q':
exit_script()
else:
return disks[int(selection)-1]
def select_source(ticket_number):
"""Select backup from those found on the BACKUP_SERVERS for the ticket."""
selected_source = None
sources = []
mount_backup_shares()
# Check for ticket folders on servers
for server in BACKUP_SERVERS:
if server['Mounted']:
print_standard('Scanning {}...'.format(server['Name']))
for d in os.scandir(r'\\{IP}\{Share}'.format(**server)):
if (d.is_dir()
and d.name.lower().startswith(ticket_number.lower())):
# Add folder to sources
sources.append({
'Name': '{:9}| File-Based: [DIR] {}'.format(
server['Name'], d.name),
'Server': server,
'Source': d})
# Check for images and subfolders
for ticket_path in sources.copy():
for item in os.scandir(ticket_path['Source'].path):
if item.is_dir():
# Add folder to sources
sources.append({
'Name': r'{:9}| File-Based: [DIR] {}\{}'.format(
ticket_path['Server']['Name'], # Server
ticket_path['Source'].name, # Ticket folder
item.name, # Sub-folder
),
'Server': ticket_path['Server'],
'Source': item})
# Check for images in folder
for subitem in os.scandir(item.path):
if REGEX_WIM_FILE.search(item.name):
# Add image to sources
try:
size = human_readable_size(item.stat().st_size)
except Exception:
size = ' ? ?' # unknown
sources.append({
'Disabled': bool(not is_valid_wim_file(subitem)),
'Name': r'{:9}| Image-Based: {:>7} {}\{}\{}'.format(
ticket_path['Server']['Name'], # Server
size, # Size (duh)
ticket_path['Source'].name, # Ticket folder
item.name, # Sub-folder
subitem.name, # Image file
),
'Server': ticket_path['Server'],
'Source': subitem})
elif REGEX_WIM_FILE.search(item.name):
# Add image to sources
try:
size = human_readable_size(item.stat().st_size)
except Exception:
size = ' ? ?' # unknown
sources.append({
'Disabled': bool(not is_valid_wim_file(item)),
'Name': r'{:9}| Image-Based: {:>7} {}\{}'.format(
ticket_path['Server']['Name'], # Server
size, # Size (duh)
ticket_path['Source'].name, # Ticket folder
item.name, # Image file
),
'Server': ticket_path['Server'],
'Source': item})
# Check for local sources
print_standard('Scanning for local sources...')
set_thread_error_mode(silent=True) # Prevents "No disk" popups
sys_drive = global_vars['Env']['SYSTEMDRIVE']
for d in psutil.disk_partitions():
if re.search(r'^{}'.format(sys_drive), d.mountpoint, re.IGNORECASE):
# Skip current OS drive
continue
if 'fixed' in d.opts:
# Skip DVD, etc
sources.append({
'Name': '{:9}| File-Based: [DISK] {}'.format(
' Local', d.mountpoint),
'Source': LocalDisk(d)})
set_thread_error_mode(silent=False) # Return to normal
# Build Menu
sources.sort(key=itemgetter('Name'))
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
# Select backup from sources
if len(sources) > 0:
selection = menu_select(
'Which backup are we using?',
main_entries=sources,
action_entries=actions,
disabled_label='DAMAGED')
if selection == 'Q':
umount_backup_shares()
exit_script()
else:
selected_source = sources[int(selection)-1]['Source']
else:
print_error('ERROR: No backups found for ticket: {}.'.format(
ticket_number))
umount_backup_shares()
pause("Press Enter to exit...")
exit_script()
# Done
return selected_source
def set_thread_error_mode(silent=True):
"""Disable or Enable Windows error message dialogs.
Disable when scanning for disks to avoid popups for empty cardreaders, etc
"""
# Code borrowed from: https://stackoverflow.com/a/29075319
kernel32 = ctypes.WinDLL('kernel32')
if silent:
kernel32.SetThreadErrorMode(SEM_FAIL, ctypes.byref(SEM_NORMAL))
else:
kernel32.SetThreadErrorMode(SEM_NORMAL, ctypes.byref(SEM_NORMAL))
def transfer_source(source_obj, dest_path, selected_items):
"""Transfer, or extract, files/folders from source to destination."""
if source_obj.is_dir():
# Run FastCopy for each selection "group"
for group in selected_items:
try_and_print(message=group['Message'],
function=run_fast_copy, cs='Done',
items=group['Items'],
dest=group['Destination'])
else:
if REGEX_WIM_FILE.search(source_obj.name):
# Extract files from WIM
for group in selected_items:
try_and_print(message=group['Message'],
function=run_wimextract, cs='Done',
source=source_obj.path,
items=group['Items'],
dest=group['Destination'])
else:
print_error('ERROR: Unsupported image: {}'.format(source_obj.path))
raise GenericError
def umount_backup_shares():
"""Unnount the backup shares regardless of current status."""
for server in BACKUP_SERVERS:
umount_network_share(server)
def umount_network_share(server):
"""Unnount a network share defined by server."""
cmd = r'net use \\{IP}\{Share} /delete'.format(**server)
cmd = cmd.split(' ')
try:
run_program(cmd)
except Exception:
print_error(r'Failed to umount \\{Name}\{Share}.'.format(**server))
sleep(1)
else:
print_info('Umounted {Name}'.format(**server))
server['Mounted'] = False
def wim_contains(source_path, file_path):
"""Check if the WIM contains a file or folder."""
_cmd = [
global_vars['Tools']['wimlib-imagex'], 'dir',
source_path, '1',
'--path={}'.format(file_path),
'--one-file-only']
try:
run_program(_cmd)
except subprocess.CalledProcessError:
return False
else:
return True
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,114 +0,0 @@
# Wizard Kit: Functions - Diagnostics
from functions.common import *
# STATIC VARIABLES
AUTORUNS_SETTINGS = {
r'Software\Sysinternals\AutoRuns': {
'checkvirustotal': 1,
'EulaAccepted': 1,
'shownomicrosoft': 1,
'shownowindows': 1,
'showonlyvirustotal': 1,
'submitvirustotal': 0,
'verifysignatures': 1,
},
r'Software\Sysinternals\AutoRuns\SigCheck': {
'EulaAccepted': 1,
},
r'Software\Sysinternals\AutoRuns\Streams': {
'EulaAccepted': 1,
},
r'Software\Sysinternals\AutoRuns\VirusTotal': {
'VirusTotalTermsAccepted': 1,
},
}
def check_connection():
"""Check if the system is online and optionally abort the script."""
while True:
result = try_and_print(message='Ping test...', function=ping, cs='OK')
if result['CS']:
break
else:
if not ask('ERROR: System appears offline, try again?'):
if ask('Continue anyway?'):
break
else:
abort()
def run_autoruns():
"""Run AutoRuns in the background with VirusTotal checks enabled."""
extract_item('Autoruns', filter='autoruns*', silent=True)
# Update AutoRuns settings before running
for path, settings in AUTORUNS_SETTINGS.items():
winreg.CreateKey(HKCU, path)
with winreg.OpenKey(HKCU, path, access=winreg.KEY_WRITE) as key:
for name, value in settings.items():
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
popen_program(global_vars['Tools']['AutoRuns'], minimized=True)
def run_hwinfo_sensors():
"""Run HWiNFO sensors."""
path = r'{BinDir}\HWiNFO'.format(**global_vars)
for bit in [32, 64]:
# Configure
source = r'{}\general.ini'.format(path)
dest = r'{}\HWiNFO{}.ini'.format(path, bit)
shutil.copy(source, dest)
with open(dest, 'a') as f:
f.write('SensorsOnly=1\n')
f.write('SummaryOnly=0\n')
popen_program(global_vars['Tools']['HWiNFO'])
def run_xmplay():
"""Run XMPlay to test audio."""
extract_item('XMPlay', silent=True)
cmd = [global_vars['Tools']['XMPlay'],
r'{BinDir}\XMPlay\music.7z'.format(**global_vars)]
popen_program(cmd)
def run_hitmanpro():
"""Run HitmanPro in the background."""
extract_item('HitmanPro', silent=True)
cmd = [
global_vars['Tools']['HitmanPro'],
'/quiet', '/noinstall', '/noupload',
r'/log={LogDir}\hitman.xml'.format(**global_vars)]
popen_program(cmd)
def run_process_killer():
"""Kill most running processes skipping those in the whitelist.txt."""
# borrowed from TronScript (reddit.com/r/TronScript)
# credit to /u/cuddlychops06
prev_dir = os.getcwd()
extract_item('ProcessKiller', silent=True)
os.chdir(r'{BinDir}\ProcessKiller'.format(**global_vars))
run_program(['ProcessKiller.exe', '/silent'], check=False)
os.chdir(prev_dir)
def run_rkill():
"""Run RKill and cleanup afterwards."""
extract_item('RKill', silent=True)
cmd = [
global_vars['Tools']['RKill'],
'-l', r'{LogDir}\RKill.log'.format(**global_vars),
'-new_console:n', '-new_console:s33V']
run_program(cmd, check=False)
wait_for_process('RKill')
kill_process('notepad.exe')
# RKill cleanup
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
if os.path.exists(desktop_path):
for item in os.scandir(desktop_path):
if re.search(r'^RKill', item.name, re.IGNORECASE):
dest = re.sub(r'^(.*)\.', '\1_{Date-Time}.'.format(
**global_vars), item.name)
dest = r'{ClientDir}\Info\{name}'.format(
name=dest, **global_vars)
dest = non_clobber_rename(dest)
shutil.move(item.path, dest)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,465 +0,0 @@
# Wizard Kit: Functions - Information
from borrowed import knownpaths
from operator import itemgetter
from functions.common import *
from functions.activation import *
# Regex
REGEX_OFFICE = re.compile(
r'(Microsoft (Office\s+'
r'(365|Enterprise|Home|Pro(\s|fessional)'
r'|Single|Small|Standard|Starter|Ultimate|system)'
r'|Works[-\s\d]+\d)'
r'|(Libre|Open|Star)\s*Office'
r'|WordPerfect|Gnumeric|Abiword)',
re.IGNORECASE)
# STATIC VARIABLES
REG_PROFILE_LIST = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
REG_SHELL_FOLDERS = r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders'
TMP_HIVE_PATH = 'TEMP_HIVE_MOUNT'
EXTRA_FOLDERS = [
'Dropbox',
'Google Drive',
'OneDrive',
'SkyDrive',
]
SHELL_FOLDERS = {
#GUIDs from: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx
'Desktop': (
'{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}',
),
'Documents': (
'Personal',
'{FDD39AD0-238F-46AF-ADB4-6C85480369C7}',
),
'Downloads': (
'{374DE290-123F-4565-9164-39C4925E467B}',
),
'Favorites': (
'{1777F761-68AD-4D8A-87BD-30B759FA33DD}',
),
'Music': (
'My Music',
'{4BD8D571-6D19-48D3-BE97-422220080E43}',
),
'Pictures': (
'My Pictures',
'{33E28130-4E1E-4676-835A-98395C3BC3BB}',
),
'Videos': (
'My Video',
'{18989B1D-99B5-455B-841C-AB7C74E4DDFC}',
),
}
def backup_file_list():
"""Export current file listing for the system."""
extract_item('Everything', silent=True)
cmd = [
global_vars['Tools']['Everything'],
'-nodb',
'-create-filelist',
r'{LogDir}\File List.txt'.format(**global_vars),
global_vars['Env']['SYSTEMDRIVE']]
run_program(cmd)
def backup_power_plans():
"""Export current power plans."""
os.makedirs(r'{BackupDir}\Power Plans'.format(**global_vars), exist_ok=True)
plans = run_program(['powercfg', '/L'])
plans = plans.stdout.decode().splitlines()
plans = [p for p in plans if re.search(r'^Power Scheme', p)]
for p in plans:
guid = re.sub(r'Power Scheme GUID:\s+([0-9a-f\-]+).*', r'\1', p)
name = re.sub(
r'Power Scheme GUID:\s+[0-9a-f\-]+\s+\(([^\)]+)\).*', r'\1', p)
out = r'{BackupDir}\Power Plans\{name}.pow'.format(
name=name, **global_vars)
if not os.path.exists(out):
cmd = ['powercfg', '-export', out, guid]
run_program(cmd, check=False)
def backup_registry():
"""Backup registry including user hives."""
extract_item('erunt', silent=True)
cmd = [
global_vars['Tools']['ERUNT'],
r'{LogDir}\Registry'.format(**global_vars),
'sysreg',
'curuser',
'otherusers',
'/noprogresswindow']
run_program(cmd)
def get_folder_size(path):
"""Get (human-readable) size of folder passed, returns str."""
size = 'Unknown'
cmd = [global_vars['Tools']['Du'], '-nobanner', '-q', path]
try:
out = run_program(cmd)
except FileNotFoundError:
# Failed to find folder
pass
except subprocess.CalledProcessError:
# Failed to get folder size
pass
else:
size = out.stdout.decode().splitlines()[4]
size = re.sub(r'Size:\s+([\d,]+)\sbytes$', r'\1', size)
size = size.replace(',', '')
size = human_readable_size(size)
return size
def get_installed_office():
"""Get list of installed Office programs."""
programs = []
log_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format(
**global_vars)
with open (log_file, 'r') as f:
for line in sorted(f.readlines()):
if REGEX_OFFICE.search(line):
programs.append(line[4:82].strip())
if len(programs) == 0:
programs = ['No programs found']
return programs
def get_shell_path(folder, user='current'):
"""Get shell path using SHGetKnownFolderPath via knownpaths, returns str.
NOTE: Only works for the current user.
Code based on https://gist.github.com/mkropat/7550097
"""
path = None
folderid = None
if user.lower() == 'public':
user = 'common'
try:
folderid = getattr(knownpaths.FOLDERID, folder)
except AttributeError:
# Unknown folder ID, ignore and return None
pass
if folderid:
try:
path = knownpaths.get_path(folderid, getattr(knownpaths.UserHandle, user))
except PathNotFoundException:
# Folder not found, ignore and return None
pass
return path
def get_user_data_paths(user):
"""Get user data paths for provided user, returns dict."""
hive_path = user['SID']
paths = {
'Profile': {
'Path': None,
},
'Shell Folders': {},
'Extra Folders': {},
}
unload_hive = False
if user['Name'] == global_vars['Env']['USERNAME']:
# We can use SHGetKnownFolderPath for the current user
paths['Profile']['Path'] = get_shell_path('Profile')
paths['Shell Folders'] = {f: {'Path': get_shell_path(f)}
for f in SHELL_FOLDERS.keys()}
else:
# We have to use the NTUSER.dat hives which isn't recommended by MS
try:
key_path = r'{}\{}'.format(REG_PROFILE_LIST, user['SID'])
with winreg.OpenKey(HKLM, key_path) as key:
paths['Profile']['Path'] = winreg.QueryValueEx(
key, 'ProfileImagePath')[0]
except Exception:
# Profile path not found, leaving as None.
pass
# Shell folders (Prep)
if not reg_path_exists(HKU, hive_path) and paths['Profile']['Path']:
# User not logged-in, loading hive
# Also setting unload_hive so it will be unloaded later.
hive_path = TMP_HIVE_PATH
cmd = ['reg', 'load', r'HKU\{}'.format(TMP_HIVE_PATH),
r'{}\NTUSER.DAT'.format(paths['Profile']['Path'])]
unload_hive = True
try:
run_program(cmd)
except subprocess.CalledProcessError:
# Failed to load user hive
pass
# Shell folders
shell_folders = r'{}\{}'.format(hive_path, REG_SHELL_FOLDERS)
if (reg_path_exists(HKU, hive_path)
and reg_path_exists(HKU, shell_folders)):
with winreg.OpenKey(HKU, shell_folders) as key:
for folder, values in SHELL_FOLDERS.items():
for value in values:
try:
path = winreg.QueryValueEx(key, value)[0]
except FileNotFoundError:
# Skip missing values
pass
else:
paths['Shell Folders'][folder] = {'Path': path}
# Stop checking values for this folder
break
# Shell folder (extra check)
if paths['Profile']['Path']:
for folder in SHELL_FOLDERS.keys():
folder_path = r'{Path}\{folder}'.format(
folder=folder, **paths['Profile'])
if (folder not in paths['Shell Folders']
and os.path.exists(folder_path)):
paths['Shell Folders'][folder] = {'Path': folder_path}
# Extra folders
if paths['Profile']['Path']:
for folder in EXTRA_FOLDERS:
folder_path = r'{Path}\{folder}'.format(
folder=folder, **paths['Profile'])
if os.path.exists(folder_path):
paths['Extra Folders'][folder] = {'Path': folder_path}
# Shell folders (cleanup)
if unload_hive:
cmd = ['reg', 'unload', r'HKU\{}'.format(TMP_HIVE_PATH)]
run_program(cmd, check=False)
# Done
return paths
def get_user_folder_sizes(users):
"""Update list(users) to include folder paths and sizes."""
extract_item('du', filter='du*', silent=True)
# Configure Du
winreg.CreateKey(HKCU, r'Software\Sysinternals\Du')
with winreg.OpenKey(HKCU,
r'Software\Sysinternals\Du', access=winreg.KEY_WRITE) as key:
winreg.SetValueEx(key, 'EulaAccepted', 0, winreg.REG_DWORD, 1)
for u in users:
u.update(get_user_data_paths(u))
if u['Profile']['Path']:
u['Profile']['Size'] = get_folder_size(u['Profile']['Path'])
for folder in u['Shell Folders'].keys():
u['Shell Folders'][folder]['Size'] = get_folder_size(
u['Shell Folders'][folder]['Path'])
for folder in u['Extra Folders'].keys():
u['Extra Folders'][folder]['Size'] = get_folder_size(
u['Extra Folders'][folder]['Path'])
def get_user_list():
"""Get user list via WMIC, returns list of dicts."""
users = []
# Get user info from WMI
cmd = ['wmic', 'useraccount', 'get', '/format:csv']
try:
out = run_program(cmd)
except subprocess.CalledProcessError:
# Meh, return empty list to avoid a full crash
return users
entries = out.stdout.decode().splitlines()
entries = [e.strip().split(',') for e in entries if e.strip()]
# Add user(s) to dict
keys = entries[0]
for e in entries[1:]:
# Create dict using 1st line (keys)
e = dict(zip(keys, e))
# Set Active status via 'Disabled' TRUE/FALSE str
e['Active'] = bool(e['Disabled'].upper() == 'FALSE')
# Assume SIDs ending with 1000+ are "Standard" and others are "System"
e['Type'] = 'Standard' if re.search(r'-1\d+$', e['SID']) else 'System'
users.append(e)
# Sort list
users.sort(key=itemgetter('Name'))
# Done
return users
def reg_path_exists(hive, path):
"""Test if specified path exists, returns bool."""
try:
winreg.QueryValue(hive, path)
except FileNotFoundError:
return False
else:
return True
def run_aida64():
"""Run AIDA64 to save system reports."""
extract_item('AIDA64', silent=True)
# All system info
config = r'{BinDir}\AIDA64\full.rpf'.format(**global_vars)
report_file = r'{LogDir}\System Information (AIDA64).html'.format(
**global_vars)
if not os.path.exists(report_file):
cmd = [
global_vars['Tools']['AIDA64'],
'/R', report_file,
'/CUSTOM', config,
'/HTML', '/SILENT', '/SAFEST']
run_program(cmd, check=False)
# Installed Programs
config = r'{BinDir}\AIDA64\installed_programs.rpf'.format(**global_vars)
report_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format(
**global_vars)
if not os.path.exists(report_file):
cmd = [
global_vars['Tools']['AIDA64'],
'/R', report_file,
'/CUSTOM', config,
'/TEXT', '/SILENT', '/SAFEST']
run_program(cmd, check=False)
# Product Keys
config = r'{BinDir}\AIDA64\licenses.rpf'.format(**global_vars)
report_file = r'{LogDir}\Product Keys (AIDA64).txt'.format(**global_vars)
if not os.path.exists(report_file):
cmd = [
global_vars['Tools']['AIDA64'],
'/R', report_file,
'/CUSTOM', config,
'/TEXT', '/SILENT', '/SAFEST']
run_program(cmd, check=False)
def run_bleachbit():
"""Run BleachBit preview and save log.
This is a preview so no files should be deleted."""
if not os.path.exists(global_vars['LogDir']+r'\BleachBit.log'):
extract_item('BleachBit', silent=True)
cmd = [global_vars['Tools']['BleachBit'], '--preview', '--preset']
out = run_program(cmd, check=False)
# Save stderr
if out.stderr.decode().splitlines():
with open(global_vars['LogDir']+r'\BleachBit.err', 'a') as f:
for line in out.stderr.decode().splitlines():
f.write(line.strip() + '\n')
# Save stdout
with open(global_vars['LogDir']+r'\BleachBit.log', 'a') as f:
for line in out.stdout.decode().splitlines():
f.write(line.strip() + '\n')
def show_disk_usage(disk):
"""Show free and used space for a specified disk."""
print_standard('{:5}'.format(disk.device.replace('/', ' ')),
end='', flush=True, timestamp=False)
try:
usage = psutil.disk_usage(disk.device)
display_string = '{percent:>5.2f}% Free ({free} / {total})'.format(
percent = 100 - usage.percent,
free = human_readable_size(usage.free, 2),
total = human_readable_size(usage.total, 2))
if usage.percent > 85:
print_error(display_string, timestamp=False)
elif usage.percent > 75:
print_warning(display_string, timestamp=False)
else:
print_standard(display_string, timestamp=False)
except Exception:
print_warning('Unknown', timestamp=False)
def show_free_space(indent=8, width=32):
"""Show free space info for all fixed disks."""
message = 'Free Space:'
for disk in psutil.disk_partitions():
try:
if 'fixed' in disk.opts:
try_and_print(message=message, function=show_disk_usage,
ns='Unknown', silent_function=False,
indent=indent, width=width, disk=disk)
message = ''
except Exception:
pass
def show_installed_ram():
"""Show installed RAM."""
mem = psutil.virtual_memory()
if mem.total > 5905580032:
# > 5.5 Gb so 6Gb or greater
print_standard(human_readable_size(mem.total).strip())
elif mem.total > 3758096384:
# > 3.5 Gb so 4Gb or greater
print_warning(human_readable_size(mem.total).strip())
else:
print_error(human_readable_size(mem.total).strip())
def show_os_activation():
"""Show OS activation info."""
act_str = get_activation_string()
if windows_is_activated():
print_standard(act_str, timestamp=False)
elif re.search(r'unavailable', act_str, re.IGNORECASE):
print_warning(act_str, timestamp=False)
else:
print_error(act_str, timestamp=False)
def show_os_name():
"""Show extended OS name (including warnings)."""
os_name = global_vars['OS']['DisplayName']
if global_vars['OS']['Arch'] == 32:
# Show all 32-bit installs as an error message
print_error(os_name, timestamp=False)
else:
if re.search(r'(unrecognized|very outdated)', os_name, re.IGNORECASE):
print_error(os_name, timestamp=False)
elif re.search(r'outdated', os_name, re.IGNORECASE):
print_warning(os_name, timestamp=False)
else:
print_standard(os_name, timestamp=False)
def show_temp_files_size():
"""Show total size of temp files identified by BleachBit."""
size = None
with open(r'{LogDir}\BleachBit.log'.format(**global_vars), 'r') as f:
for line in f.readlines():
if re.search(r'^disk space to be recovered:', line, re.IGNORECASE):
size = re.sub(r'.*: ', '', line.strip())
size = re.sub(r'(\w)iB$', r' \1b', size)
if size is None:
print_warning(size, timestamp=False)
else:
print_standard(size, timestamp=False)
def show_user_data_summary(indent=8, width=32):
"""Print user data folder sizes for all users."""
users = get_user_list()
users = [u for u in users if u['Active']]
get_user_folder_sizes(users)
for user in users:
print_success('{indent}User: {user}'.format(
indent = ' '*int(indent/2),
user = user['Name']))
for section in ['Profile', None, 'Shell Folders', 'Extra Folders']:
folders = []
if section is None:
# Divider
print_standard('{}{}'.format(' '*indent, '-'*(width+6)))
elif section == 'Profile':
folders = {'Profile': user['Profile']}
else:
folders = user[section]
for folder in folders:
print_standard(
'{indent}{folder:<{width}}{size:>6} ({path})'.format(
indent = ' ' * indent,
width = width,
folder = folder,
size = folders[folder]['Size'],
path = folders[folder]['Path']))
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,325 +0,0 @@
# Wizard Kit: Functions - 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,111 +0,0 @@
# Wizard Kit: Functions - Product Keys
from functions.common import *
# Regex
REGEX_REGISTRY_DIRS = re.compile(
r'^(config$|RegBack$|System32$|Transfer|Win)',
re.IGNORECASE)
REGEX_SOFTWARE_HIVE = re.compile(r'^Software$', re.IGNORECASE)
def extract_keys():
"""Extract keys from provided hives and return a dict."""
keys = {}
# Extract keys
extract_item('ProduKey', silent=True)
for hive in find_software_hives():
cmd = [
global_vars['Tools']['ProduKey'],
'/IEKeys', '0',
'/WindowsKeys', '1',
'/OfficeKeys', '1',
'/ExtractEdition', '1',
'/nosavereg',
'/regfile', hive,
'/scomma', '']
try:
out = run_program(cmd)
except subprocess.CalledProcessError:
# Ignore and return empty dict
pass
else:
for line in out.stdout.decode().splitlines():
# Add key to keys under product only if unique
tmp = line.split(',')
product = tmp[0]
key = tmp[2]
if product not in keys:
keys[product] = []
if key not in keys[product]:
keys[product].append(key)
# Done
return keys
def list_clientdir_keys():
"""List product keys found in hives inside the ClientDir."""
keys = extract_keys()
key_list = []
if keys:
for product in sorted(keys):
key_list.append(product)
for key in sorted(keys[product]):
key_list.append(' {key}'.format(key=key))
else:
key_list.append('No keys found.')
return key_list
def find_software_hives():
"""Search for transferred SW hives and return a list."""
hives = []
search_paths = [global_vars['ClientDir']]
while len(search_paths) > 0:
for item in os.scandir(search_paths.pop(0)):
if item.is_dir() and REGEX_REGISTRY_DIRS.search(item.name):
search_paths.append(item.path)
if item.is_file() and REGEX_SOFTWARE_HIVE.search(item.name):
hives.append(item.path)
return hives
def get_product_keys():
"""List product keys from saved report."""
keys = []
log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars)
with open (log_file, 'r') as f:
for line in f.readlines():
if re.search(r'^Product Name', line):
line = re.sub(r'^Product Name\s+:\s+(.*)', r'\1', line.strip())
keys.append(line)
if keys:
return keys
else:
return ['No product keys found']
def run_produkey():
"""Run ProduKey and save report in the ClientDir."""
extract_item('ProduKey', silent=True)
log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars)
if not os.path.exists(log_file):
# Clear current configuration
for config in ['ProduKey.cfg', 'ProduKey64.cfg']:
config = r'{BinDir}\ProduKey\{config}'.format(
config=config, **global_vars)
try:
if os.path.exists(config):
os.remove(config)
except Exception:
pass
cmd = [
global_vars['Tools']['ProduKey'],
'/nosavereg',
'/stext',
log_file]
run_program(cmd, check=False)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,126 +0,0 @@
# Wizard Kit: Functions - Repairs
from functions.common import *
def run_chkdsk(repair=False):
"""Run CHKDSK scan or schedule offline repairs."""
if repair:
run_chkdsk_offline()
else:
run_chkdsk_scan()
def run_chkdsk_scan():
"""Run CHKDSK in a "split window" and report errors."""
if global_vars['OS']['Version'] in ['8', '10']:
cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE'], '/scan', '/perf']
else:
cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE']]
out = run_program(cmd, check=False)
# retcode == 0: no issues
# retcode == 1: fixed issues (also happens when chkdsk.exe is killed?)
# retcode == 2: issues
if int(out.returncode) > 0:
# print_error(' ERROR: CHKDSK encountered errors')
raise GenericError
# Save stderr
with open(r'{LogDir}\CHKDSK.err'.format(**global_vars), 'a') as f:
for line in out.stderr.decode().splitlines():
f.write(line.strip() + '\n')
# Save stdout
with open(r'{LogDir}\CHKDSK.log'.format(**global_vars), 'a') as f:
for line in out.stdout.decode().splitlines():
f.write(line.strip() + '\n')
def run_chkdsk_offline():
"""Set filesystem 'dirty bit' to force a chkdsk during next boot."""
cmd = [
'fsutil', 'dirty',
'set',
global_vars['Env']['SYSTEMDRIVE']]
out = run_program(cmd, check=False)
if int(out.returncode) > 0:
raise GenericError
def run_dism(repair=False):
"""Run DISM /RestoreHealth, then /CheckHealth, and then report errors."""
if global_vars['OS']['Version'] in ['8', '10']:
if repair:
# Restore Health
cmd = [
'DISM', '/Online',
'/Cleanup-Image', '/RestoreHealth',
r'/LogPath:"{LogDir}\DISM_RestoreHealth.log"'.format(
**global_vars),
'-new_console:n', '-new_console:s33V']
else:
# Scan Health
cmd = [
'DISM', '/Online',
'/Cleanup-Image', '/ScanHealth',
r'/LogPath:"{LogDir}\DISM_ScanHealth.log"'.format(
**global_vars),
'-new_console:n', '-new_console:s33V']
run_program(cmd, pipe=False, check=False, shell=True)
wait_for_process('dism')
# Now check health
cmd = [
'DISM', '/Online',
'/Cleanup-Image', '/CheckHealth',
r'/LogPath:"{LogDir}\DISM_CheckHealth.log"'.format(**global_vars)]
result = run_program(cmd, shell=True).stdout.decode()
# Check result
if 'no component store corruption detected' not in result.lower():
raise GenericError
else:
raise UnsupportedOSError
def run_kvrt():
"""Run KVRT."""
extract_item('KVRT', silent=True)
os.makedirs(global_vars['QuarantineDir'], exist_ok=True)
cmd = [
global_vars['Tools']['KVRT'],
'-accepteula', '-dontcryptsupportinfo', '-fixednames',
'-d', global_vars['QuarantineDir'],
'-processlevel', '3']
popen_program(cmd, pipe=False)
def run_sfc_scan():
"""Run SFC in a "split window" and report errors."""
cmd = [
r'{SYSTEMROOT}\System32\sfc.exe'.format(**global_vars['Env']),
'/scannow']
out = run_program(cmd, check=False)
# Save stderr
with open(r'{LogDir}\SFC.err'.format(**global_vars), 'a') as f:
for line in out.stderr.decode('utf-8', 'ignore').splitlines():
f.write(line.strip() + '\n')
# Save stdout
with open(r'{LogDir}\SFC.log'.format(**global_vars), 'a') as f:
for line in out.stdout.decode('utf-8', 'ignore').splitlines():
f.write(line.strip() + '\n')
# Check result
log_text = out.stdout.decode('utf-8', 'ignore').replace('\0', '')
if re.findall(r'did\s+not\s+find\s+any\s+integrity\s+violations', log_text):
pass
elif re.findall(r'successfully\s+repaired\s+them', log_text):
raise GenericRepair
else:
raise GenericError
def run_tdsskiller():
"""Run TDSSKiller."""
extract_item('TDSSKiller', silent=True)
os.makedirs(r'{QuarantineDir}\TDSSKiller'.format(
**global_vars), exist_ok=True)
cmd = [
global_vars['Tools']['TDSSKiller'],
'-l', r'{LogDir}\TDSSKiller.log'.format(**global_vars),
'-qpath', r'{QuarantineDir}\TDSSKiller'.format(**global_vars),
'-accepteula', '-accepteulaksn',
'-dcexact', '-tdlfs']
run_program(cmd, pipe=False)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,272 +0,0 @@
# Wizard Kit: Functions - Setup
from functions.common import *
# STATIC VARIABLES
HKCU = winreg.HKEY_CURRENT_USER
HKLM = winreg.HKEY_LOCAL_MACHINE
SETTINGS_CLASSIC_START = {
r'Software\IvoSoft\ClassicShell\Settings': {},
r'Software\IvoSoft\ClassicStartMenu': {
'DWORD Items': {'ShowedStyle2': 1},
},
r'Software\IvoSoft\ClassicStartMenu\MRU': {},
r'Software\IvoSoft\ClassicStartMenu\Settings': {
'DWORD Items': {'SkipMetro': 1},
'SZ Items': {
'MenuStyle': 'Win7',
'RecentPrograms': 'Recent',
},
},
}
SETTINGS_EXPLORER_SYSTEM = {
# Disable Telemetry
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
'DWORD Items': {'AllowTelemetry': 0},
},
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
'DWORD Items': {'AllowTelemetry': 0},
'WOW64_32': True,
},
r'SOFTWARE\Policies\Microsoft\Windows\DataCollection': {
'DWORD Items': {'AllowTelemetry': 0},
},
# Disable Wi-Fi Sense
r'Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting': {
'DWORD Items': {'Value': 0},
},
r'Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots': {
'DWORD Items': {'Value': 0},
},
# Disable Location Tracking
r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}': {
'DWORD Items': {'SensorPermissionState': 0},
},
r'System\CurrentControlSet\Services\lfsvc\Service\Configuration': {
'Status': {'Value': 0},
},
}
SETTINGS_EXPLORER_USER = {
# Disable Cortana
r'Software\Microsoft\Personalization\Settings': {
'DWORD Items': {'AcceptedPrivacyPolicy': 0},
},
r'Software\Microsoft\InputPersonalization': {
'DWORD Items': {
'RestrictImplicitTextCollection': 1,
'RestrictImplicitInkCollection': 1
},
},
r'Software\Microsoft\InputPersonalization\TrainedDataStore': {
'DWORD Items': {'HarvestContacts': 1},
},
# Hide Search button / box
r'Software\Microsoft\Windows\CurrentVersion\Search': {
'DWORD Items': {'SearchboxTaskbarMode': 0},
},
# Change default Explorer view to "Computer"
r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced': {
'DWORD Items': {'LaunchTo': 1},
},
}
SETTINGS_GOOGLE_CHROME = {
r'Software\Google\Chrome\Extensions': {
'WOW64_32': True,
},
r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': {
'SZ Items': {
'update_url': 'https://clients2.google.com/service/update2/crx'},
'WOW64_32': True,
},
r'Software\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco': {
'SZ Items': {
'update_url': 'https://clients2.google.com/service/update2/crx'},
'WOW64_32': True,
},
}
VCR_REDISTS = [
{'Name': 'Visual C++ 2008 SP1 x32...',
'Cmd': [r'2008sp1\x32\vcredist.exe', '/qb! /norestart']},
{'Name': 'Visual C++ 2008 SP1 x64...',
'Cmd': [r'2008sp1\x64\vcredist.exe', '/qb! /norestart']},
{'Name': 'Visual C++ 2010 x32...',
'Cmd': [r'2010sp1\x32\vcredist.exe', '/passive', '/norestart']},
{'Name': 'Visual C++ 2010 x64...',
'Cmd': [r'2010sp1\x64\vcredist.exe', '/passive', '/norestart']},
{'Name': 'Visual C++ 2012 Update 4 x32...',
'Cmd': [r'2012u4\x32\vcredist.exe', '/passive', '/norestart']},
{'Name': 'Visual C++ 2012 Update 4 x64...',
'Cmd': [r'2012u4\x64\vcredist.exe', '/passive', '/norestart']},
{'Name': 'Visual C++ 2013 x32...',
'Cmd': [r'2013\x32\vcredist.exe', '/install',
'/passive', '/norestart']},
{'Name': 'Visual C++ 2013 x64...',
'Cmd': [r'2013\x64\vcredist.exe', '/install',
'/passive', '/norestart']},
{'Name': 'Visual C++ 2017 x32...',
'Cmd': [r'2017\x32\vcredist.exe', '/install',
'/passive', '/norestart']},
{'Name': 'Visual C++ 2017 x64...',
'Cmd': [r'2017\x64\vcredist.exe', '/install',
'/passive', '/norestart']},
]
def config_classicstart():
"""Configure ClassicStart."""
# User level, not system level
cs_exe = r'{PROGRAMFILES}\Classic Shell\ClassicStartMenu.exe'.format(
**global_vars['Env'])
skin = r'{PROGRAMFILES}\Classic Shell\Skins\Metro-Win10-Black.skin7'.format(
**global_vars['Env'])
extract_item('ClassicStartSkin', silent=True)
# Stop Classic Start
run_program([cs_exe, '-exit'], check=False)
sleep(1)
kill_process('ClassicStartMenu.exe')
# Configure
write_registry_settings(SETTINGS_CLASSIC_START, all_users=False)
if global_vars['OS']['Version'] == '10' and os.path.exists(skin):
# Enable Win10 theme if on Win10
key_path = r'Software\IvoSoft\ClassicStartMenu\Settings'
with winreg.OpenKey(HKCU, key_path, access=winreg.KEY_WRITE) as key:
winreg.SetValueEx(
key, 'SkinW7', 0, winreg.REG_SZ, 'Metro-Win10-Black')
winreg.SetValueEx(key, 'SkinVariationW7', 0, winreg.REG_SZ, '')
# Pin Browser to Start Menu (Classic)
firefox = r'{PROGRAMDATA}\Start Menu\Programs\Mozilla Firefox.lnk'.format(
**global_vars['Env'])
chrome = r'{PROGRAMDATA}\Start Menu\Programs\Google Chrome.lnk'.format(
**global_vars['Env'])
dest_path = r'{APPDATA}\ClassicShell\Pinned'.format(**global_vars['Env'])
source = None
dest = None
if os.path.exists(firefox):
source = firefox
dest = r'{}\Mozilla Firefox.lnk'.format(dest_path)
elif os.path.exists(chrome):
source = chrome
dest = r'{}\Google Chrome.lnk'.format(dest_path)
if source:
try:
os.makedirs(dest_path, exist_ok=True)
shutil.copy(source, dest)
except Exception:
pass # Meh, it's fine without
# (Re)start Classic Start
run_program([cs_exe, '-exit'], check=False)
sleep(1)
kill_process('ClassicStartMenu.exe')
sleep(1)
popen_program(cs_exe)
def write_registry_settings(settings, all_users=False):
"""Write registry values from custom dict of dicts."""
hive = HKCU
if all_users:
hive = HKLM
for k, v in settings.items():
# CreateKey
access = winreg.KEY_WRITE
if 'WOW64_32' in v:
access = access | winreg.KEY_WOW64_32KEY
winreg.CreateKeyEx(hive, k, 0, access)
# Create values
with winreg.OpenKeyEx(hive, k, 0, access) as key:
for name, value in v.get('DWORD Items', {}).items():
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
for name, value in v.get('SZ Items', {}).items():
winreg.SetValueEx(key, name, 0, winreg.REG_SZ, value)
def config_explorer_system():
"""Configure Windows Explorer for all users via Registry settings."""
write_registry_settings(SETTINGS_EXPLORER_SYSTEM, all_users=True)
def config_explorer_user():
"""Configure Windows Explorer for current user via Registry settings."""
write_registry_settings(SETTINGS_EXPLORER_USER, all_users=False)
def update_clock():
"""Set Timezone and sync clock."""
run_program(['tzutil' ,'/s', TIME_ZONE], check=False)
run_program(['net', 'stop', 'w32ime'], check=False)
run_program(
['w32tm', '/config', '/syncfromflags:manual',
'/manualpeerlist:"us.pool.ntp.org time.nist.gov time.windows.com"',
],
check=False)
run_program(['net', 'start', 'w32ime'], check=False)
run_program(['w32tm', '/resync', '/nowait'], check=False)
# Installations
def install_adobe_reader():
"""Install Adobe Reader."""
cmd = [
r'{BaseDir}\Installers\Extras\Office\Adobe Reader DC.exe'.format(
**global_vars),
'/sAll',
'/msi', '/norestart', '/quiet',
'ALLUSERS=1',
'EULA_ACCEPT=YES']
try_and_print(message='Adobe Reader DC...', function=run_program, cmd=cmd)
def install_chrome_extensions():
"""Update registry to 'install' Google Chrome extensions for all users."""
write_registry_settings(SETTINGS_GOOGLE_CHROME, all_users=True)
def install_classicstart_skin():
"""Extract ClassicStart skin to installation folder."""
if global_vars['OS']['Version'] not in ['8', '10']:
raise UnsupportedOSError
extract_item('ClassicStartSkin', silent=True)
source = r'{BinDir}\ClassicStartSkin\Metro-Win10-Black.skin7'.format(
**global_vars)
dest_path = r'{PROGRAMFILES}\Classic Shell\Skins'.format(
**global_vars['Env'])
dest = r'{}\Metro-Win10-Black.skin7'.format(dest_path)
os.makedirs(dest_path, exist_ok=True)
shutil.copy(source, dest)
def install_firefox_extensions():
"""Extract Firefox extensions to installation folder."""
dist_path = r'{PROGRAMFILES}\Mozilla Firefox\distribution\extensions'.format(
**global_vars['Env'])
# Extract extension(s) to distribution folder
cmd = [
global_vars['Tools']['SevenZip'], 'x', '-aos', '-bso0', '-bse0',
'-p{ArchivePassword}'.format(**global_vars),
'-o{dist_path}'.format(dist_path=dist_path),
r'{CBinDir}\FirefoxExtensions.7z'.format(**global_vars)]
run_program(cmd, check=False)
def install_ninite_bundle(mse=False):
"""Run Ninite file(s) based on OS version."""
if global_vars['OS']['Version'] in ['8', '10']:
# Modern selection
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Modern.exe'.format(
**global_vars))
else:
# Legacy selection
if mse:
cmd = r'{BaseDir}\Installers\Extras\Security'.format(**global_vars)
cmd += r'\Microsoft Security Essentials.exe'
popen_program(cmd)
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Legacy.exe'.format(
**global_vars))
def install_vcredists():
"""Install all supported Visual C++ runtimes."""
extract_item('_vcredists', silent=True)
prev_dir = os.getcwd()
os.chdir(r'{BinDir}\_vcredists'.format(**global_vars))
for vcr in VCR_REDISTS:
try_and_print(message=vcr['Name'], function=run_program, cmd=vcr['Cmd'])
os.chdir(prev_dir)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,893 +0,0 @@
# Wizard Kit: Functions - Build / Update
import requests
from functions.common import *
from functions.data import *
from settings.launchers import *
from settings.music import *
from settings.sources import *
def compress_and_remove_item(item):
try:
compress_item(item)
except:
raise GenericError
else:
remove_item(item.path)
def compress_item(item):
# Prep
prev_dir = os.getcwd()
dest = '{}.7z'.format(item.path)
wd = item.path
include_str = '*'
if os.path.isfile(wd):
wd = os.path.abspath(r'{}\{}'.format(wd, os.path.pardir))
include_str = item.name
os.chdir(wd)
# Compress
cmd = [
global_vars['Tools']['SevenZip'],
'a', dest,
'-t7z', '-mx=7', '-myx=7', '-ms=on', '-mhe', '-bso0', '-bse0',
'-p{}'.format(ARCHIVE_PASSWORD),
include_str,
]
run_program(cmd)
# Done
os.chdir(prev_dir)
def download_generic(out_dir, out_name, source_url):
"""Downloads a file using requests."""
## Code based on this Q&A: https://stackoverflow.com/q/16694907
### Asked by: https://stackoverflow.com/users/427457/roman-podlinov
### Edited by: https://stackoverflow.com/users/657427/christophe-roussy
### Using answer: https://stackoverflow.com/a/39217788
### Answer from: https://stackoverflow.com/users/4323/john-zwinck
os.makedirs(out_dir, exist_ok=True)
out_path = '{}/{}'.format(out_dir, out_name)
try:
r = requests.get(source_url, stream=True)
with open(out_path, 'wb') as f:
shutil.copyfileobj(r.raw, f)
r.close()
except:
raise GenericError('Failed to download file.')
def download_to_temp(out_name, source_url):
download_generic(global_vars['TmpDir'], out_name, source_url)
def extract_generic(source, dest, mode='x', sz_args=[]):
cmd = [
global_vars['Tools']['SevenZip'],
mode, source, r'-o{}'.format(dest),
'-aoa', '-bso0', '-bse0',
]
cmd.extend(sz_args)
run_program(cmd)
def extract_temp_to_bin(source, item, mode='x', sz_args=[]):
source = r'{}\{}'.format(global_vars['TmpDir'], source)
dest = r'{}\{}'.format(global_vars['BinDir'], item)
extract_generic(source, dest, mode, sz_args)
def extract_temp_to_cbin(source, item, mode='x', sz_args=[]):
source = r'{}\{}'.format(global_vars['TmpDir'], source)
dest = r'{}\{}'.format(global_vars['CBinDir'], item)
include_path = r'{}\_include\{}'.format(global_vars['CBinDir'], item)
if os.path.exists(include_path):
shutil.copytree(include_path, dest)
extract_generic(source, dest, mode, sz_args)
def generate_launcher(section, name, options):
# Prep
dest = r'{}\{}'.format(global_vars['BaseDir'], section)
if section == '(Root)':
dest = global_vars['BaseDir']
full_path = r'{}\{}.cmd'.format(dest, name)
template = r'{}\Scripts\Launcher_Template.cmd'.format(global_vars['BinDir'])
# Format options
f_options = {}
for opt in options.keys():
# Values need to be a list to support the multi-line extra code sections
if opt == 'Extra Code':
f_options['rem EXTRA_CODE'] = options['Extra Code']
elif re.search(r'^L_\w+', opt, re.IGNORECASE):
new_opt = 'set {}='.format(opt)
f_options[new_opt] = ['set {}={}'.format(opt, options[opt])]
# Read template and update using f_options
out_text = []
with open(template, 'r') as f:
for line in f.readlines():
# Strip all lines to let Python handle/correct the CRLF endings
line = line.strip()
if line in f_options:
# Extend instead of append to support extra code sections
out_text.extend(f_options[line])
else:
out_text.append(line)
# Write file
os.makedirs(dest, exist_ok=True)
with open(full_path, 'w') as f:
# f.writelines(out_text)
f.write('\n'.join(out_text))
def remove_item(item_path):
if os.path.exists(item_path):
if os.path.isdir(item_path):
shutil.rmtree(item_path, ignore_errors=True)
else:
os.remove(item_path)
def remove_from_kit(item):
item_locations = []
for p in [global_vars['BinDir'], global_vars['CBinDir']]:
item_locations.append(r'{}\{}'.format(p, item))
item_locations.append(r'{}\_Drivers\{}'.format(p, item))
for item_path in item_locations:
remove_item(item_path)
def remove_from_temp(item):
item_path = r'{}\{}'.format(global_vars['TmpDir'], item)
remove_item(item_path)
def resolve_dynamic_url(source_url, regex):
"""Scan source_url for a url using the regex provided; returns str."""
# Load the download page
try:
download_page = requests.get(source_url)
except Exception:
# "Fail silently as the download_to_temp() function will catch it
return None
# Scan for the url using the regex provided
url = None
for line in download_page.content.decode().splitlines():
if re.search(regex, line):
url = line.strip()
url = re.sub(r'.*(a |)href="([^"]+)".*', r'\2', url)
url = re.sub(r".*(a |)href='([^']+)'.*", r'\2', url)
break
# Return
return url
def scan_for_net_installers(server, family_name, min_year):
if not server['Mounted']:
mount_network_share(server)
if server['Mounted']:
for year in os.scandir(r'\\{IP}\{Share}'.format(**server)):
if int(year.name) < min_year:
# Don't support outdated installers
continue
for version in os.scandir(year.path):
section = r'Installers\Extras\{}\{}'.format(
family_name, year.name)
if section not in LAUNCHERS:
LAUNCHERS[section] = {}
name = version.name
if re.search(r'(exe|msi)$', name, re.IGNORECASE):
name = name[:-4]
if name not in LAUNCHERS[section]:
LAUNCHERS[section][name] = {
'L_TYPE': family_name,
'L_PATH': year.name,
'L_ITEM': version.name,
}
umount_network_share(server)
## Data Recovery ##
def update_testdisk():
# Stop running processes
for exe in ['fidentify_win.exe', 'photorec_win.exe',
'qphotorec_win.exe', 'testdisk_win.exe']:
kill_process(exe)
# Remove existing folders
remove_from_kit('TestDisk')
# Download
download_to_temp('testdisk_wip.zip', SOURCE_URLS['TestDisk'])
# Extract files
extract_temp_to_cbin('testdisk_wip.zip', 'TestDisk')
dest = r'{}\TestDisk'.format(global_vars['CBinDir'])
for item in os.scandir(r'{}\testdisk-7.1-WIP'.format(dest)):
dest_item = '{}\{}'.format(dest, item.name)
if not os.path.exists(dest_item):
shutil.move(item.path, dest_item)
shutil.rmtree(
r'{}\TestDisk\testdisk-7.1-WIP'.format(global_vars['CBinDir']))
# Cleanup
remove_from_temp('testdisk_wip.zip')
## Data Transfers ##
def update_fastcopy():
## NOTE: Lives in .bin uncompressed
# Stop running processes
for process in ['FastCopy.exe', 'FastCopy64.exe']:
kill_process(process)
# Remove existing folders
remove_from_kit('FastCopy')
# Download
download_to_temp('FastCopy32.zip', SOURCE_URLS['FastCopy32'])
download_to_temp('FastCopy64.zip', SOURCE_URLS['FastCopy64'])
# Extract
extract_temp_to_bin('FastCopy64.zip', 'FastCopy', sz_args=['FastCopy.exe'])
shutil.move(
r'{}\FastCopy\FastCopy.exe'.format(global_vars['BinDir']),
r'{}\FastCopy\FastCopy64.exe'.format(global_vars['BinDir']))
extract_temp_to_bin('FastCopy32.zip', 'FastCopy', sz_args=[r'-x!setup.exe', r'-x!*.dll'])
# Cleanup
remove_from_temp('FastCopy32.zip')
remove_from_temp('FastCopy64.zip')
def update_wimlib():
# Stop running processes
kill_process('wimlib-imagex.exe')
# Remove existing folders
remove_from_kit('wimlib')
# Download
download_to_temp('wimlib32.zip', SOURCE_URLS['wimlib32'])
download_to_temp('wimlib64.zip', SOURCE_URLS['wimlib64'])
# Extract
extract_generic(
r'{}\wimlib32.zip'.format(global_vars['TmpDir']),
r'{}\wimlib\x32'.format(global_vars['CBinDir']))
extract_generic(
r'{}\wimlib64.zip'.format(global_vars['TmpDir']),
r'{}\wimlib\x64'.format(global_vars['CBinDir']))
# Cleanup
remove_from_temp('wimlib32.zip')
remove_from_temp('wimlib64.zip')
def update_xyplorer():
# Stop running processes
kill_process('XYplorerFree.exe')
# Remove existing folders
remove_from_kit('XYplorerFree')
# Download
download_to_temp('xyplorer_free.zip', SOURCE_URLS['XYplorerFree'])
# Extract files
extract_temp_to_cbin('xyplorer_free.zip', 'XYplorerFree')
# Cleanup
remove_from_temp('xyplorer_free.zip')
## Diagnostics ##
def update_aida64():
# Stop running processes
kill_process('notepadplusplus.exe')
# Remove existing folders
remove_from_kit('AIDA64')
# Download
download_to_temp('aida64.zip', SOURCE_URLS['AIDA64'])
# Extract files
extract_temp_to_cbin('aida64.zip', 'AIDA64')
# Cleanup
remove_from_temp('aida64.zip')
def update_autoruns():
# Stop running processes
kill_process('Autoruns.exe')
kill_process('Autoruns64.exe')
# Remove existing folders
remove_from_kit('Autoruns')
# Download
download_to_temp('Autoruns.zip', SOURCE_URLS['Autoruns'])
# Extract files
extract_temp_to_cbin('Autoruns.zip', 'Autoruns')
# Cleanup
remove_from_temp('Autoruns.zip')
def update_bleachbit():
# Stop running processes
kill_process('bleachbit.exe')
# Remove existing folders
remove_from_kit('BleachBit')
# Download
download_to_temp('bleachbit.zip', SOURCE_URLS['BleachBit'])
download_to_temp('Winapp2.zip', SOURCE_URLS['Winapp2'])
# Extract files
extract_temp_to_cbin('bleachbit.zip', 'BleachBit')
extract_generic(
r'{}\Winapp2.zip'.format(global_vars['TmpDir']),
r'{}\BleachBit\cleaners'.format(global_vars['CBinDir']),
mode='e', sz_args=[r'Winapp2-master\Non-CCleaner\Winapp2.ini'])
# Move files into place
dest = r'{}\BleachBit'.format(global_vars['CBinDir'])
for item in os.scandir(r'{}\BleachBit-Portable'.format(dest)):
dest_item = '{}\{}'.format(dest, item.name)
if not os.path.exists(dest_item):
shutil.move(item.path, dest_item)
shutil.rmtree(
r'{}\BleachBit\BleachBit-Portable'.format(global_vars['CBinDir']))
# Cleanup
remove_from_temp('bleachbit.zip')
remove_from_temp('Winapp2.zip')
def update_bluescreenview():
# Stop running processes
for exe in ['BlueScreenView.exe', 'BlueScreenView64.exe']:
kill_process(exe)
# Remove existing folders
remove_from_kit('BlueScreenView')
# Download
download_to_temp('bluescreenview32.zip', SOURCE_URLS['BlueScreenView32'])
download_to_temp('bluescreenview64.zip', SOURCE_URLS['BlueScreenView64'])
# Extract files
extract_temp_to_cbin('bluescreenview64.zip', 'BlueScreenView', sz_args=['BlueScreenView.exe'])
shutil.move(
r'{}\BlueScreenView\BlueScreenView.exe'.format(global_vars['CBinDir']),
r'{}\BlueScreenView\BlueScreenView64.exe'.format(global_vars['CBinDir']))
extract_temp_to_cbin('bluescreenview32.zip', 'BlueScreenView')
# Cleanup
remove_from_temp('bluescreenview32.zip')
remove_from_temp('bluescreenview64.zip')
def update_erunt():
# Stop running processes
kill_process('ERUNT.EXE')
# Remove existing folders
remove_from_kit('ERUNT')
# Download
download_to_temp('erunt.zip', SOURCE_URLS['ERUNT'])
# Extract files
extract_temp_to_cbin('erunt.zip', 'ERUNT')
# Cleanup
remove_from_temp('erunt.zip')
def update_hitmanpro():
# Stop running processes
for exe in ['HitmanPro.exe', 'HitmanPro64.exe']:
kill_process(exe)
# Remove existing folders
remove_from_kit('HitmanPro')
# Download
dest = r'{}\HitmanPro'.format(global_vars['CBinDir'])
download_generic(dest, 'HitmanPro.exe', SOURCE_URLS['HitmanPro32'])
download_generic(dest, 'HitmanPro64.exe', SOURCE_URLS['HitmanPro64'])
def update_hwinfo():
## NOTE: Lives in .bin uncompressed
# Stop running processes
for exe in ['HWiNFO32.exe', 'HWiNFO64.exe']:
kill_process(exe)
# Download
download_to_temp('HWiNFO32.zip', SOURCE_URLS['HWiNFO32'])
download_to_temp('HWiNFO64.zip', SOURCE_URLS['HWiNFO64'])
# Extract files
extract_temp_to_bin('HWiNFO32.zip', 'HWiNFO')
extract_temp_to_bin('HWiNFO64.zip', 'HWiNFO')
# Cleanup
remove_from_temp('HWiNFO32.zip')
remove_from_temp('HWiNFO64.zip')
def update_produkey():
# Stop running processes
for exe in ['ProduKey.exe', 'ProduKey64.exe']:
kill_process(exe)
# Remove existing folders
remove_from_kit('ProduKey')
# Download
download_to_temp('produkey32.zip', SOURCE_URLS['ProduKey32'])
download_to_temp('produkey64.zip', SOURCE_URLS['ProduKey64'])
# Extract files
extract_temp_to_cbin('produkey64.zip', 'ProduKey', sz_args=['ProduKey.exe'])
shutil.move(
r'{}\ProduKey\ProduKey.exe'.format(global_vars['CBinDir']),
r'{}\ProduKey\ProduKey64.exe'.format(global_vars['CBinDir']))
extract_temp_to_cbin('produkey32.zip', 'ProduKey')
# Cleanup
remove_from_temp('produkey32.zip')
remove_from_temp('produkey64.zip')
## Drivers ##
def update_intel_rst():
# Remove existing folders
remove_from_kit('Intel RST')
# Prep
dest = r'{}\_Drivers\Intel RST'.format(global_vars['CBinDir'])
include_path = r'{}\_include\_Drivers\Intel RST'.format(
global_vars['CBinDir'])
if os.path.exists(include_path):
shutil.copytree(include_path, dest)
# Download
for name, url in RST_SOURCES.items():
download_generic(dest, name, url)
def update_intel_ssd_toolbox():
# Remove existing folders
remove_from_kit('Intel SSD Toolbox.exe')
# Download
download_generic(
r'{}\_Drivers\Intel SSD Toolbox'.format(global_vars['CBinDir']),
'Intel SSD Toolbox.exe',
SOURCE_URLS['Intel SSD Toolbox'])
def update_samsung_magician():
# Remove existing folders
remove_from_kit('Samsung Magician.exe')
# Download
download_generic(
r'{}\_Drivers\Samsung Magician'.format(global_vars['CBinDir']),
'Samsung Magician.exe',
SOURCE_URLS['Samsung Magician'])
def update_sdi_origin():
# Download aria2
download_to_temp('aria2.zip', SOURCE_URLS['aria2'])
aria_source = r'{}\aria2.zip'.format(global_vars['TmpDir'])
aria_dest = r'{}\aria2'.format(global_vars['TmpDir'])
aria = r'{}\aria2c.exe'.format(aria_dest)
extract_generic(aria_source, aria_dest, mode='e')
# Prep for torrent download
download_to_temp('sdio.torrent', SOURCE_URLS['SDIO Torrent'])
sdio_torrent = r'{}\sdio.torrent'.format(global_vars['TmpDir'])
out = run_program([aria, sdio_torrent, '-S'])
indexes = []
for line in out.stdout.decode().splitlines():
r = re.search(r'^\s*(\d+)\|(.*)', line)
if r and not re.search(r'(\.(bat|inf)|Video|Server|Printer|XP)', line, re.IGNORECASE):
indexes.append(int(r.group(1)))
indexes = [str(i) for i in sorted(indexes)]
# Download SDI Origin
cmd = [
aria,
'--select-file={}'.format(','.join(indexes)),
'-d', aria_dest,
'--seed-time=0',
sdio_torrent,
'-new_console:n', '-new_console:s33V',
]
run_program(cmd, pipe=False, check=False, shell=True)
sleep(1)
wait_for_process('aria2c')
# Download SDI Origin extra themes
download_to_temp('sdio_themes.zip', SOURCE_URLS['SDIO Themes'])
theme_source = r'{}\sdio_themes.zip'.format(global_vars['TmpDir'])
theme_dest = r'{}\SDIO_Update\tools\SDI\themes'.format(aria_dest)
extract_generic(theme_source, theme_dest)
# Move files into place
for item in os.scandir(r'{}\SDIO_Update'.format(aria_dest)):
dest_item = '{}\_Drivers\SDIO\{}'.format(
global_vars['BinDir'], item.name)
r = re.search(r'^SDIO_x?(64|)_?R.*exe$', item.name, re.IGNORECASE)
if r:
dest_item = dest_item.replace(item.name, 'SDIO{}.exe'.format(
r.group(1)))
if (not os.path.exists(dest_item)
and not re.search(r'\.(inf|bat)$', item.name, re.IGNORECASE)):
shutil.move(item.path, dest_item)
# Cleanup
remove_from_temp('aria2')
remove_from_temp('aria2.zip')
remove_from_temp('sdio.torrent')
remove_from_temp('sdio_themes.zip')
## Installers ##
def update_adobe_reader_dc():
# Prep
dest = r'{}\.root_items\Installers\Extras\Office'.format(
global_vars['BaseDir'])
if os.path.exists(r'{}\Installers'.format(global_vars['BaseDir'])):
dest = dest.replace(r'\.root_items', '')
# Remove existing folders
try:
os.remove(r'{}\Adobe Reader DC.exe'.format(dest))
except FileNotFoundError:
pass
# Download
download_generic(
dest, 'Adobe Reader DC.exe', SOURCE_URLS['Adobe Reader DC'])
def update_office():
# Remove existing folders
remove_from_kit('_Office')
# Prep
dest = r'{}\_Office'.format(global_vars['CBinDir'])
include_path = r'{}\_include\_Office'.format(global_vars['CBinDir'])
if os.path.exists(include_path):
shutil.copytree(include_path, dest)
# Download and extract
for year in ['2013', '2016']:
name = 'odt{}.exe'.format(year)
url = 'Office Deployment Tool {}'.format(year)
download_to_temp(name, SOURCE_URLS[url])
cmd = [
r'{}\odt{}.exe'.format(global_vars['TmpDir'], year),
r'/extract:{}\{}'.format(global_vars['TmpDir'], year),
'/quiet',
]
run_program(cmd)
shutil.move(
r'{}\{}'.format(global_vars['TmpDir'], year),
r'{}\_Office\{}'.format(global_vars['CBinDir'], year))
# Cleanup
remove_from_temp('odt2013.exe')
remove_from_temp('odt2016.exe')
def update_classic_start_skin():
# Remove existing folders
remove_from_kit('ClassicStartSkin')
# Download
download_generic(
r'{}\ClassicStartSkin'.format(global_vars['CBinDir']),
'Metro-Win10-Black.skin7',
SOURCE_URLS['ClassicStartSkin'])
def update_vcredists():
# Remove existing folders
remove_from_kit('_vcredists')
# Prep
dest = r'{}\_vcredists'.format(global_vars['CBinDir'])
include_path = r'{}\_include\_vcredists'.format(global_vars['CBinDir'])
if os.path.exists(include_path):
shutil.copytree(include_path, dest)
# Download
for year in VCREDIST_SOURCES.keys():
for bit in ['32', '64']:
dest = r'{}\_vcredists\{}\x{}'.format(
global_vars['CBinDir'], year, bit)
download_generic(
dest,
'vcredist.exe',
VCREDIST_SOURCES[year][bit])
def update_one_ninite(section, dest, name, url, indent=8, width=40):
# Prep
url = 'https://ninite.com/{}/ninite.exe'.format(url)
# Download
download_generic(out_dir=dest, out_name=name, source_url=url)
# Copy to Installers folder
installer_parent = r'{}\Installers\Extras\{}'.format(
global_vars['BaseDir'], section)
installer_dest = r'{}\{}'.format(installer_parent, name)
os.makedirs(installer_parent, exist_ok=True)
if os.path.exists(installer_dest):
remove_item(installer_dest)
shutil.copy(r'{}\{}'.format(dest, name), installer_dest)
def update_all_ninite(indent=8, width=40, other_results={}):
print_info('{}Ninite'.format(' '*int(indent/2)))
for section in sorted(NINITE_SOURCES.keys()):
print_success('{}{}'.format(' '*int(indent/4*3), section))
dest = r'{}\_Ninite\{}'.format(global_vars['CBinDir'], section)
for name, url in sorted(NINITE_SOURCES[section].items()):
try_and_print(message=name, function=update_one_ninite,
other_results=other_results, indent=indent, width=width,
section=section, dest=dest, name=name, url=url)
## Misc ##
def update_caffeine():
# Stop running processes
kill_process('caffeine.exe')
# Remove existing folders
remove_from_kit('Caffeine')
# Download
download_to_temp('caffeine.zip', SOURCE_URLS['Caffeine'])
# Extract files
extract_temp_to_cbin('caffeine.zip', 'Caffeine')
# Cleanup
remove_from_temp('caffeine.zip')
def update_du():
# Stop running processes
kill_process('du.exe')
kill_process('du64.exe')
# Remove existing folders
remove_from_kit('Du')
# Download
download_to_temp('du.zip', SOURCE_URLS['Du'])
# Extract files
extract_temp_to_cbin('du.zip', 'Du')
# Cleanup
remove_from_temp('du.zip')
def update_everything():
# Stop running processes
for exe in ['Everything.exe', 'Everything64.exe']:
kill_process(exe)
# Remove existing folders
remove_from_kit('Everything')
# Download
download_to_temp('everything32.zip', SOURCE_URLS['Everything32'])
download_to_temp('everything64.zip', SOURCE_URLS['Everything64'])
# Extract files
extract_temp_to_cbin('everything64.zip', 'Everything', sz_args=['Everything.exe'])
shutil.move(
r'{}\Everything\Everything.exe'.format(global_vars['CBinDir']),
r'{}\Everything\Everything64.exe'.format(global_vars['CBinDir']))
extract_temp_to_cbin('everything32.zip', 'Everything')
# Cleanup
remove_from_temp('everything32.zip')
remove_from_temp('everything64.zip')
def update_firefox_ublock_origin():
# Remove existing folders
remove_from_kit('FirefoxExtensions')
# Download
download_to_temp('ff-uBO.xpi', SOURCE_URLS['Firefox uBO'])
# Extract files
extract_generic(
r'{}\ff-uBO.xpi'.format(global_vars['TmpDir']),
r'{}\FirefoxExtensions\uBlock0@raymondhill.net'.format(
global_vars['CBinDir']))
# Cleanup
remove_from_temp('ff-uBO.xpi')
def update_notepadplusplus():
# Stop running processes
kill_process('notepadplusplus.exe')
# Remove existing folders
remove_from_kit('NotepadPlusPlus')
# Download
download_to_temp('npp.7z', SOURCE_URLS['NotepadPlusPlus'])
# Extract files
extract_temp_to_cbin('npp.7z', 'NotepadPlusPlus')
shutil.move(
r'{}\NotepadPlusPlus\notepad++.exe'.format(global_vars['CBinDir']),
r'{}\NotepadPlusPlus\notepadplusplus.exe'.format(global_vars['CBinDir'])
)
# Cleanup
remove_from_temp('npp.7z')
def update_putty():
# Stop running processes
kill_process('PUTTY.EXE')
# Remove existing folders
remove_from_kit('PuTTY')
# Download
download_to_temp('putty.zip', SOURCE_URLS['PuTTY'])
# Extract files
extract_temp_to_cbin('putty.zip', 'PuTTY')
# Cleanup
remove_from_temp('putty.zip')
def update_treesizefree():
# Stop running processes
kill_process('TreeSizeFree.exe')
# Remove existing folders
remove_from_kit('TreeSizeFree')
# Download
download_to_temp(
'treesizefree.zip.gz', SOURCE_URLS['TreeSizeFree'])
# Extract files
## NOTE: When downloaded using requests it is a .zip.gz?
source = r'{}\treesizefree.zip.gz'.format(global_vars['TmpDir'])
extract_generic(source, global_vars['TmpDir'])
extract_temp_to_cbin('treesizefree.zip', 'TreeSizeFree')
# Cleanup
remove_from_temp('treesizefree.zip')
remove_from_temp('treesizefree.zip.gz')
def update_xmplay():
# Stop running processes
kill_process('xmplay.exe')
# Remove existing folders
remove_from_kit('XMPlay')
# Download
download_to_temp('xmplay.zip', SOURCE_URLS['XMPlay'])
download_to_temp('xmp-7z.zip', SOURCE_URLS['XMPlay 7z'])
download_to_temp('xmp-gme.zip', SOURCE_URLS['XMPlay Game'])
download_to_temp('xmp-rar.zip', SOURCE_URLS['XMPlay RAR'])
download_to_temp('WAModern.zip', SOURCE_URLS['XMPlay WAModern'])
# Extract files
extract_temp_to_cbin('xmplay.zip', 'XMPlay',
mode='e', sz_args=['xmplay.exe', 'xmplay.txt'])
for item in ['xmp-7z', 'xmp-gme', 'xmp-rar', 'WAModern']:
filter = []
if item == 'WAModern':
filter.append('WAModern NightVision.xmpskin')
extract_generic(
r'{}\{}.zip'.format(global_vars['TmpDir'], item),
r'{}\XMPlay\plugins'.format(global_vars['CBinDir']),
mode='e', sz_args=filter)
# Download Music
dest = r'{}\XMPlay\music_tmp\MOD'.format(global_vars['CBinDir'])
for mod in MUSIC_MOD:
name = mod.split('#')[-1]
url = 'https://api.modarchive.org/downloads.php?moduleid={}'.format(mod)
download_generic(dest, name, url)
dest = r'{}\XMPlay\music_tmp\SNES'.format(global_vars['CBinDir'])
for game in MUSIC_SNES:
name = '{}.rsn'.format(game)
url = 'http://snesmusic.org/v2/download.php?spcNow={}'.format(game)
download_generic(dest, name, url)
# Compress Music
cmd = [
global_vars['Tools']['SevenZip'],
'a', r'{}\XMPlay\music.7z'.format(global_vars['CBinDir']),
'-t7z', '-mx=9', '-bso0', '-bse0',
r'{}\XMPlay\music_tmp\*'.format(global_vars['CBinDir']),
]
run_program(cmd)
# Cleanup
remove_item(r'{}\XMPlay\music_tmp'.format(global_vars['CBinDir']))
remove_from_temp('xmplay.zip')
remove_from_temp('xmp-7z.zip')
remove_from_temp('xmp-gme.zip')
remove_from_temp('xmp-rar.zip')
remove_from_temp('WAModern.zip')
## Repairs ##
def update_adwcleaner():
# Stop running processes
kill_process('AdwCleaner.exe')
# Remove existing folders
remove_from_kit('AdwCleaner')
# Download
url = resolve_dynamic_url(
SOURCE_URLS['AdwCleaner'],
'id="downloadLink"')
download_generic(
r'{}\AdwCleaner'.format(global_vars['CBinDir']), 'AdwCleaner.exe', url)
def update_kvrt():
# Stop running processes
kill_process('KVRT.exe')
# Remove existing folders
remove_from_kit('KVRT')
# Download
download_generic(
r'{}\KVRT'.format(global_vars['CBinDir']),
'KVRT.exe',
SOURCE_URLS['KVRT'])
def update_rkill():
# Stop running processes
kill_process('RKill.exe')
# Remove existing folders
remove_from_kit('RKill')
# Download
url = resolve_dynamic_url(
SOURCE_URLS['RKill'],
'href.*rkill\.exe')
download_generic(
r'{}\RKill'.format(global_vars['CBinDir']), 'RKill.exe', url)
def update_tdsskiller():
# Stop running processes
kill_process('TDSSKiller.exe')
# Remove existing folders
remove_from_kit('TDSSKiller')
# Download
download_generic(
r'{}\TDSSKiller'.format(global_vars['CBinDir']),
'TDSSKiller.exe',
SOURCE_URLS['TDSSKiller'])
## Uninstallers ##
def update_iobit_uninstaller():
# Stop running processes
kill_process('IObitUninstallerPortable.exe')
# Remove existing folders
remove_from_kit('IObitUninstallerPortable')
# Download
download_generic(
global_vars['CBinDir'],
'IObitUninstallerPortable.exe',
SOURCE_URLS['IOBit_Uninstaller'])
# "Install"
cmd = r'{}\IObitUninstallerPortable.exe'.format(global_vars['CBinDir'])
popen_program(cmd)
sleep(1)
wait_for_process('IObitUninstallerPortable')
# Cleanup
remove_from_kit('IObitUninstallerPortable.exe')
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,59 +0,0 @@
# Wizard Kit: Install the standard SW bundle based on the OS version
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.setup import *
init_global_vars()
os.system('title {}: SW Bundle Tool'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\Install SW Bundle.log'.format(**global_vars)
if __name__ == '__main__':
try:
stay_awake()
os.system('cls')
print_info('{}: SW Bundle Tool\n'.format(KIT_NAME_FULL))
other_results = {
'Error': {
'CalledProcessError': 'Unknown Error',
},
'Warning': {
'GenericRepair': 'Repaired',
'UnsupportedOSError': 'Unsupported OS',
}}
answer_extensions = ask('Install Extensions?')
answer_adobe_reader = ask('Install Adobe Reader?')
answer_vcr = ask('Install Visual C++ Runtimes?')
answer_ninite = ask('Install Ninite Bundle?')
if answer_ninite and global_vars['OS']['Version'] in ['7']:
# Vista is dead, not going to check for it
answer_mse = ask('Install MSE?')
else:
answer_mse = False
if answer_extensions:
print_info('Installing Extensions')
try_and_print(message='Classic Shell skin...',
function=install_classicstart_skin,
other_results=other_results)
try_and_print(message='Google Chrome extensions...',
function=install_chrome_extensions)
try_and_print(message='Mozilla Firefox extensions...',
function=install_firefox_extensions)
print_info('Installing Programs')
if answer_adobe_reader:
install_adobe_reader()
if answer_vcr:
install_vcredists()
if answer_ninite:
try_and_print(message='Ninite bundle...',
function=install_ninite_bundle, cs='Started', mse=answer_mse)
print_standard('\nDone.')
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,34 +0,0 @@
# Wizard Kit: Install Visual C++ Runtimes
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.setup import *
init_global_vars()
os.system('title {}: Install Visual C++ Runtimes'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\Install Visual C++ Runtimes.log'.format(**global_vars)
if __name__ == '__main__':
try:
stay_awake()
os.system('cls')
print_info('{}: Install Visual C++ Runtimes\n'.format(KIT_NAME_FULL))
other_results = {
'Error': {
'CalledProcessError': 'Unknown Error',
}}
if ask('Install Visual C++ Runtimes?'):
install_vcredists()
else:
abort()
print_standard('\nDone.')
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,44 +0,0 @@
# Wizard Kit: Enter SafeMode by editing the BCD
import os
import sys
# STATIC VARIABLES
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.common import *
init_global_vars()
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
if __name__ == '__main__':
try:
os.system('cls')
print_info('{}: SafeMode Tool\n'.format(KIT_NAME_FULL))
if not ask('Enable booting to SafeMode (with Networking)?'):
abort()
# Edit BCD to set safeboot as default
cmd = ['bcdedit', '/set', '{default}', 'safeboot', 'network']
run_program(cmd, check=False)
# Enable MSI access under safemode
cmd = ['reg', 'add', REG_MSISERVER, '/f']
run_program(cmd, check=False)
cmd = ['reg', 'add', REG_MSISERVER, '/ve',
'/t', 'REG_SZ', '/d', 'Service', '/f']
run_program(cmd, check=False)
## Done ##
pause('Press Enter to reboot...')
cmd = ['shutdown', '-r', '-t', '3']
run_program(cmd, check=False)
# Done
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,42 +0,0 @@
# Wizard Kit: Exit SafeMode by editing the BCD
import os
import sys
# STATIC VARIABLES
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.common import *
init_global_vars()
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
if __name__ == '__main__':
try:
os.system('cls')
print_info('{}: SafeMode Tool\n'.format(KIT_NAME_FULL))
if not ask('Disable booting to SafeMode?'):
abort()
# Edit BCD to remove safeboot value
for boot in ['{current}', '{default}']:
cmd = ['bcdedit', '/deletevalue', boot, 'safeboot']
run_program(cmd, check=False)
# Disable MSI access under safemode
cmd = ['reg', 'delete', REG_MSISERVER, '/f']
run_program(cmd, check=False)
## Done ##
pause('Press Enter to reboot...')
cmd = ['shutdown', '-r', '-t', '3']
run_program(cmd, check=False)
# Done
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,586 +0,0 @@
# Wizard Kit: Settings - Launchers
LAUNCHERS = {
r'(Root)': {
'Activate Windows': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'activate.py',
'L_ELEV': 'True',
},
'Enter SafeMode': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'safemode_enter.py',
'L_ELEV': 'True',
},
'Exit SafeMode': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'safemode_exit.py',
'L_ELEV': 'True',
},
'System Checklist': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'system_checklist.py',
'L_ELEV': 'True',
},
'System Diagnostics': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'system_diagnostics.py',
'L_ELEV': 'True',
},
'User Checklist': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'user_checklist.py',
},
},
r'Data Recovery': {
'PhotoRec (CLI)': {
'L_TYPE': 'Executable',
'L_PATH': 'TestDisk',
'L_ITEM': 'photorec_win.exe',
'L_ELEV': 'True',
'L__CLI': 'True',
},
'PhotoRec': {
'L_TYPE': 'Executable',
'L_PATH': 'TestDisk',
'L_ITEM': 'qphotorec_win.exe',
'L_ELEV': 'True',
},
'TestDisk': {
'L_TYPE': 'Executable',
'L_PATH': 'TestDisk',
'L_ITEM': 'testdisk_win.exe',
'L_ELEV': 'True',
'L__CLI': 'True',
},
},
r'Data Transfers': {
'FastCopy (as ADMIN)': {
'L_TYPE': 'Executable',
'L_PATH': 'FastCopy',
'L_ITEM': 'FastCopy.exe',
'L_ARGS': (
r' /logfile=%log_dir%\FastCopy.log'
r' /cmd=noexist_only'
r' /utf8'
r' /skip_empty_dir'
r' /linkdest'
r' /exclude='
r'$RECYCLE.BIN;'
r'$Recycle.Bin;'
r'.AppleDB;'
r'.AppleDesktop;'
r'.AppleDouble;'
r'.com.apple.timemachine.supported;'
r'.dbfseventsd;'
r'.DocumentRevisions-V100*;'
r'.DS_Store;'
r'.fseventsd;'
r'.PKInstallSandboxManager;'
r'.Spotlight*;'
r'.SymAV*;'
r'.symSchedScanLockxz;'
r'.TemporaryItems;'
r'.Trash*;'
r'.vol;'
r'.VolumeIcon.icns;'
r'desktop.ini;'
r'Desktop?DB;'
r'Desktop?DF;'
r'hiberfil.sys;'
r'lost+found;'
r'Network?Trash?Folder;'
r'pagefile.sys;'
r'Recycled;'
r'RECYCLER;'
r'System?Volume?Information;'
r'Temporary?Items;'
r'Thumbs.db'
r' /to=%client_dir%\Transfer_%iso_date%\ '
),
'L_ELEV': 'True',
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Info /Transfer',
],
},
'FastCopy': {
'L_TYPE': 'Executable',
'L_PATH': 'FastCopy',
'L_ITEM': 'FastCopy.exe',
'L_ARGS': (
r' /logfile=%log_dir%\FastCopy.log'
r' /cmd=noexist_only'
r' /utf8'
r' /skip_empty_dir'
r' /linkdest'
r' /exclude='
r'$RECYCLE.BIN;'
r'$Recycle.Bin;'
r'.AppleDB;'
r'.AppleDesktop;'
r'.AppleDouble;'
r'.com.apple.timemachine.supported;'
r'.dbfseventsd;'
r'.DocumentRevisions-V100*;'
r'.DS_Store;'
r'.fseventsd;'
r'.PKInstallSandboxManager;'
r'.Spotlight*;'
r'.SymAV*;'
r'.symSchedScanLockxz;'
r'.TemporaryItems;'
r'.Trash*;'
r'.vol;'
r'.VolumeIcon.icns;'
r'desktop.ini;'
r'Desktop?DB;'
r'Desktop?DF;'
r'hiberfil.sys;'
r'lost+found;'
r'Network?Trash?Folder;'
r'pagefile.sys;'
r'Recycled;'
r'RECYCLER;'
r'System?Volume?Information;'
r'Temporary?Items;'
r'Thumbs.db'
r' /to=%client_dir%\Transfer_%iso_date%\ '
),
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Info /Transfer',
],
},
'KVRT': {
'L_TYPE': 'Executable',
'L_PATH': 'KVRT',
'L_ITEM': 'KVRT.exe',
'L_ARGS': (
r' -accepteula'
r' -d %q_dir%'
r' -processlevel 3'
r' -dontcryptsupportinfo'
r' -fixednames'
),
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine',
r'set "q_dir=%client_dir%\Quarantine\KVRT"',
r'mkdir "%q_dir%">nul 2>&1',
],
},
'Transferred Keys': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'transferred_keys.py',
'L_ELEV': 'True',
},
'User Data Transfer': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'user_data_transfer.py',
'L_ELEV': 'True',
},
'XYplorer (as ADMIN)': {
'L_TYPE': 'Executable',
'L_PATH': 'XYplorerFree',
'L_ITEM': 'XYplorerFree.exe',
'L_ARGS': r'/exp /win=max %userprofile%',
'L_ELEV': 'True',
},
'XYplorer': {
'L_TYPE': 'Executable',
'L_PATH': 'XYplorerFree',
'L_ITEM': 'XYplorerFree.exe',
'L_ARGS': r'/exp /win=max %userprofile%',
},
},
r'Diagnostics': {
'HWiNFO': {
'L_TYPE': 'Executable',
'L_PATH': 'HWiNFO',
'L_ITEM': 'HWiNFO.exe',
'Extra Code': [
r'for %%a in (32 64) do (',
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r')',
],
},
'ProduKey': {
'L_TYPE': 'Executable',
'L_PATH': 'ProduKey',
'L_ITEM': 'ProduKey.exe',
'L_ELEV': 'True',
'Extra Code': [
r'if exist "%bin%\ProduKey" (',
r' del "%bin%\ProduKey\ProduKey.cfg" 2>nul',
r' del "%bin%\ProduKey\ProduKey64.cfg" 2>nul',
r')',
],
},
},
r'Diagnostics\Extras': {
'AIDA64': {
'L_TYPE': 'Executable',
'L_PATH': 'AIDA64',
'L_ITEM': 'aida64.exe',
},
'Autoruns (with VirusTotal Scan)': {
'L_TYPE': 'Executable',
'L_PATH': 'Autoruns',
'L_ITEM': 'Autoruns.exe',
'L_ARGS': '-e',
'Extra Code': [
r'reg add HKCU\Software\Sysinternals\AutoRuns /v checkvirustotal /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownomicrosoft /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownowindows /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v showonlyvirustotal /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v submitvirustotal /t REG_DWORD /d 0 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v verifysignatures /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns\SigCheck /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns\Streams /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns\VirusTotal /v VirusTotalTermsAccepted /t REG_DWORD /d 1 /f >nul',
],
},
'BleachBit': {
'L_TYPE': 'Executable',
'L_PATH': 'BleachBit',
'L_ITEM': 'bleachbit.exe',
},
'BlueScreenView': {
'L_TYPE': 'Executable',
'L_PATH': 'BlueScreenView',
'L_ITEM': 'BlueScreenView.exe',
},
'ERUNT': {
'L_TYPE': 'Executable',
'L_PATH': 'erunt',
'L_ITEM': 'ERUNT.EXE',
'L_ARGS': '%log_dir%\Registry sysreg curuser otherusers',
'L_ELEV': 'True',
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
],
},
'HitmanPro': {
'L_TYPE': 'Executable',
'L_PATH': 'HitmanPro',
'L_ITEM': 'HitmanPro.exe',
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
],
},
'HWiNFO (Sensors)': {
'L_TYPE': 'Executable',
'L_PATH': 'HWiNFO',
'L_ITEM': 'HWiNFO.exe',
'Extra Code': [
r'for %%a in (32 64) do (',
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SensorsOnly=1)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r')',
],
},
},
r'Drivers': {
'Intel RST (Current Release)': {
'L_TYPE': 'Executable',
'L_PATH': '_Drivers\Intel RST',
'L_ITEM': 'SetupRST_15.8.exe',
'L_7ZIP': 'SetupRST_15.8.exe',
},
'Intel RST (Previous Releases)': {
'L_TYPE': 'Folder',
'L_PATH': '_Drivers\Intel RST',
'L_ITEM': '.',
'L_NCMD': 'True',
},
'Intel SSD Toolbox': {
'L_TYPE': 'Executable',
'L_PATH': r'_Drivers\Intel SSD Toolbox',
'L_ITEM': 'Intel SSD Toolbox.exe',
},
'Samsing Magician': {
'L_TYPE': 'Executable',
'L_PATH': r'_Drivers\Samsung Magician',
'L_ITEM': 'Samsung Magician.exe',
},
'Snappy Driver Installer Origin': {
'L_TYPE': 'Executable',
'L_PATH': '_Drivers\SDIO',
'L_ITEM': 'SDIO.exe',
},
},
r'Drivers\Extras': {
'Acer': {
'L_TYPE': 'Executable',
'L_PATH': 'HWiNFO',
'L_ITEM': 'HWiNFO.exe',
'Extra Code': [
r'for %%a in (32 64) do (',
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r')',
r'start "" "http://us.acer.com/ac/en/US/content/drivers"',
],
},
'Lenovo': {
'L_TYPE': 'Executable',
'L_PATH': 'HWiNFO',
'L_ITEM': 'HWiNFO.exe',
'Extra Code': [
r'for %%a in (32 64) do (',
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r')',
r'start "" "http://support.lenovo.com/us/en/products?tabName=Downloads"',
],
},
'Toshiba': {
'L_TYPE': 'Executable',
'L_PATH': 'HWiNFO',
'L_ITEM': 'HWiNFO.exe',
'Extra Code': [
r'for %%a in (32 64) do (',
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r')',
r'start "" "http://support.toshiba.com/drivers"',
],
},
},
r'Installers': {
'SW Bundle': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'install_sw_bundle.py',
'L_ELEV': 'True',
},
},
r'Installers\Extras\Office\2013': {
'Home and Business 2013 (x32)': {
'L_TYPE': 'Office',
'L_PATH': '2013',
'L_ITEM': 'hb_32.xml',
'L_NCMD': 'True',
},
'Home and Business 2013 (x64)': {
'L_TYPE': 'Office',
'L_PATH': '2013',
'L_ITEM': 'hb_64.xml',
'L_NCMD': 'True',
},
'Home and Student 2013 (x32)': {
'L_TYPE': 'Office',
'L_PATH': '2013',
'L_ITEM': 'hs_32.xml',
'L_NCMD': 'True',
},
'Home and Student 2013 (x64)': {
'L_TYPE': 'Office',
'L_PATH': '2013',
'L_ITEM': 'hs_64.xml',
'L_NCMD': 'True',
},
},
r'Installers\Extras\Office\2016': {
'Home and Business 2016 (x32)': {
'L_TYPE': 'Office',
'L_PATH': '2016',
'L_ITEM': 'hb_32.xml',
'L_NCMD': 'True',
},
'Home and Business 2016 (x64)': {
'L_TYPE': 'Office',
'L_PATH': '2016',
'L_ITEM': 'hb_64.xml',
'L_NCMD': 'True',
},
'Home and Student 2016 (x32)': {
'L_TYPE': 'Office',
'L_PATH': '2016',
'L_ITEM': 'hs_32.xml',
'L_NCMD': 'True',
},
'Home and Student 2016 (x64)': {
'L_TYPE': 'Office',
'L_PATH': '2016',
'L_ITEM': 'hs_64.xml',
'L_NCMD': 'True',
},
'Office 365 2016 (x32)': {
'L_TYPE': 'Office',
'L_PATH': '2016',
'L_ITEM': '365_32.xml',
'L_NCMD': 'True',
},
'Office 365 2016 (x64)': {
'L_TYPE': 'Office',
'L_PATH': '2016',
'L_ITEM': '365_64.xml',
'L_NCMD': 'True',
},
},
r'Installers\Extras\Runtimes': {
'Visual C++ Runtimes': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'install_vcredists.py',
'L_ELEV': 'True',
},
},
r'Misc': {
'ConEmu (as ADMIN)': {
'L_TYPE': 'Executable',
'L_PATH': 'ConEmu',
'L_ITEM': 'ConEmu.exe',
'L_ELEV': 'True',
},
'ConEmu': {
'L_TYPE': 'Executable',
'L_PATH': 'ConEmu',
'L_ITEM': 'ConEmu.exe',
},
'Everything': {
'L_TYPE': 'Executable',
'L_PATH': 'Everything',
'L_ITEM': 'Everything.exe',
'L_ARGS': '-nodb',
'L_ELEV': 'True',
},
'Notepad++': {
'L_TYPE': 'Executable',
'L_PATH': 'notepadplusplus',
'L_ITEM': 'notepadplusplus.exe',
},
'PuTTY': {
'L_TYPE': 'Executable',
'L_PATH': 'PuTTY',
'L_ITEM': 'PUTTY.EXE',
},
'TreeSizeFree': {
'L_TYPE': 'Executable',
'L_PATH': 'TreeSizeFree',
'L_ITEM': 'TreeSizeFree.exe',
'L_ELEV': 'True',
},
'Update Kit': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'update_kit.py',
},
'XMPlay': {
'L_TYPE': 'Executable',
'L_PATH': 'XMPlay',
'L_ITEM': 'xmplay.exe',
'L_ARGS': '"%bin%\XMPlay\music.7z"',
},
},
r'Repairs': {
'AdwCleaner': {
'L_TYPE': 'Executable',
'L_PATH': 'AdwCleaner',
'L_ITEM': 'AdwCleaner.exe',
},
'Autoruns': {
'L_TYPE': 'Executable',
'L_PATH': 'Autoruns',
'L_ITEM': 'Autoruns.exe',
'L_ARGS': '-e',
'Extra Code': [
r'reg add HKCU\Software\Sysinternals\AutoRuns /v checkvirustotal /t REG_DWORD /d 0 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownomicrosoft /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownowindows /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v showonlyvirustotal /t REG_DWORD /d 0 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v submitvirustotal /t REG_DWORD /d 0 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns /v verifysignatures /t REG_DWORD /d 0 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns\SigCheck /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns\Streams /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
r'reg add HKCU\Software\Sysinternals\AutoRuns\VirusTotal /v VirusTotalTermsAccepted /t REG_DWORD /d 1 /f >nul',
],
},
'CHKDSK': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'check_disk.py',
'L_ELEV': 'True',
},
'DISM': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'dism.py',
'L_ELEV': 'True',
},
'KVRT': {
'L_TYPE': 'Executable',
'L_PATH': 'KVRT',
'L_ITEM': 'KVRT.exe',
'L_ARGS': (
r' -accepteula'
r' -d %q_dir%'
r' -processlevel 3'
r' -dontcryptsupportinfo'
r' -fixednames'
),
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine',
r'set "q_dir=%client_dir%\Quarantine\KVRT"',
r'mkdir "%q_dir%">nul 2>&1',
],
},
'RKill': {
'L_TYPE': 'Executable',
'L_PATH': 'RKill',
'L_ITEM': 'RKill.exe',
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
],
},
'SFC Scan': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'sfc_scan.py',
'L_ELEV': 'True',
},
'TDSSKiller': {
'L_TYPE': 'Executable',
'L_PATH': 'TDSSKiller',
'L_ITEM': 'TDSSKiller.exe',
'L_ARGS': (
r' -l %log_dir%\TDSSKiller.log'
r' -qpath %q_dir%'
r' -accepteula'
r' -accepteulaksn'
r' -dcexact'
r' -tdlfs'
),
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine',
r'set "q_dir=%client_dir%\Quarantine\TDSSKiller"',
r'mkdir "%q_dir%">nul 2>&1',
],
},
},
r'Uninstallers': {
'IObit Uninstaller': {
'L_TYPE': 'Executable',
'L_PATH': 'IObitUninstallerPortable',
'L_ITEM': 'IObitUninstallerPortable.exe',
},
},
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,68 +0,0 @@
# Wizard Kit: Settings - Main / Branding
# Features
ENABLED_UPLOAD_DATA = False
# STATIC VARIABLES (also used by .cmd files)
## Not using spaces aroung '=' for easier .cmd substrings
ARCHIVE_PASSWORD='Abracadabra'
KIT_NAME_FULL='Wizard Kit'
KIT_NAME_SHORT='WK'
OFFICE_SERVER_IP='10.0.0.10'
QUICKBOOKS_SERVER_IP='10.0.0.10'
SUPPORT_TECH='2Shirt'
TIME_ZONE='Pacific Standard Time' # Always use "Standard Time" (DST is applied correctly)
# SERVER VARIABLES
## NOTE: Windows can only use one user per server. This means that if
## one server serves multiple shares then you have to use the same
## user/password for all of those shares.
BACKUP_SERVERS = [
{ 'IP': '10.0.0.10',
'Name': 'ServerOne',
'Mounted': False,
'Share': 'Backups',
'User': 'restore',
'Pass': 'Abracadabra',
},
{ 'IP': '10.0.0.11',
'Name': 'ServerTwo',
'Mounted': False,
'Share': 'Backups',
'User': 'restore',
'Pass': 'Abracadabra',
},
]
CLIENT_INFO_SERVER = {
'IP': '10.0.0.10',
'RegEntry': r'0x10001,0xcc674aebbd889f5fd553564adcf3cab550791eca12542033d52134db893c95aabb6b318a4621d8116f6838d873edfe9db4509e1dfc9177ee7484808a62cbc42b913387f694fd67e81950f85198acf721c5767b54db7b864d69cce65e12c78c87d0fb4fc54996609c9b9274b1de7bae2f95000c9ca8d7e3f9b3f2cdb21cd578adf9ba98d10400a8203bb1a879a4cd2fad99baeb12738b9b4b99fec821f881acb62598a43c059f74af287bc8dceeb4821317aa44e2e0ee66d346927a654c702854a71a2eaed6a53f6be9360c7049974a2597a548361da42ac982ae55f993700a8b1fc9f3b4458314fbd41f239de0a29716cdcefbbb2c8d02b4c2effa4163cfeac9',
'Share': '/srv/ClientInfo',
'User': 'upload',
}
OFFICE_SERVER = {
'IP': OFFICE_SERVER_IP,
'Name': 'ServerOne',
'Mounted': False,
'Share': 'Office',
'User': 'restore',
'Pass': 'Abracadabra',
}
QUICKBOOKS_SERVER = {
'IP': QUICKBOOKS_SERVER_IP,
'Name': 'ServerOne',
'Mounted': False,
'Share': 'QuickBooks',
'User': 'restore',
'Pass': 'Abracadabra',
}
WINDOWS_SERVER = {
'IP': '10.0.0.10',
'Name': 'ServerOne',
'Mounted': False,
'Share': 'Windows',
'User': 'restore',
'Pass': 'Abracadabra',
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

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

View file

@ -1,203 +0,0 @@
# Wizard Kit: Settings - Sources
SOURCE_URLS = {
'AIDA64': 'http://download.aida64.com/aida64engineer592.zip',
'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1800920044/AcroRdrDC1800920044_en_US.exe',
'AdwCleaner': 'https://toolslib.net/downloads/finish/1-adwcleaner/',
'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip',
'BleachBit': 'https://download.bleachbit.org/beta/1.17/BleachBit-1.17-portable.zip',
'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip',
'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip',
'Caffeine': 'http://www.zhornsoftware.co.uk/caffeine/caffeine.zip',
'ClassicStartSkin': 'http://www.classicshell.net/forum/download/file.php?id=3001&sid=9a195960d98fd754867dcb63d9315335',
'Du': 'https://download.sysinternals.com/files/DU.zip',
'ERUNT': 'http://www.aumha.org/downloads/erunt.zip',
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.877.x86.zip',
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.877.x64.zip',
'FastCopy32': 'http://ftp.vector.co.jp/69/28/2323/FastCopy332.zip',
'FastCopy64': 'http://ftp.vector.co.jp/69/28/2323/FastCopy332_x64.zip',
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/764482/ublock_origin-1.14.18-an+fx.xpi?src=dp-btn-primary',
'HWiNFO32': 'http://app.oldfoss.com:81/download/HWiNFO/hw32_560.zip',
'HWiNFO64': 'http://app.oldfoss.com:81/download/HWiNFO/hw64_560.zip',
'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe',
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
'IOBit_Uninstaller': 'https://portableapps.com/redirect/?a=IObitUninstallerPortable&t=http%3A%2F%2Fdownloads.portableapps.com%2Fportableapps%2Fiobituninstallerportable%2FIObitUninstallerPortable_7.0.2.49.paf.exe',
'Intel SSD Toolbox': r'https://downloadmirror.intel.com/27330/eng/Intel%20SSD%20Toolbox%20-%20v3.4.9.exe',
'KVRT': 'http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe',
'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.5.1/npp.7.5.1.bin.minimalist.7z',
'Office Deployment Tool 2013': 'https://download.microsoft.com/download/6/2/3/6230F7A2-D8A9-478B-AC5C-57091B632FCF/officedeploymenttool_x86_4827-1000.exe',
'Office Deployment Tool 2016': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_8529.3600.exe',
'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip',
'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip',
'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip',
'RKill': 'https://www.bleepingcomputer.com/download/rkill/dl/10/',
'SDIO Themes': 'http://snappy-driver-installer.org/downloads/SDIO_Themes.zip',
'SDIO Torrent': 'http://snappy-driver-installer.org/downloads/SDIO_Update.torrent',
'Samsung Magician': 'http://downloadcenter.samsung.com/content/SW/201710/20171019164455812/Samsung_Magician_Installer.exe',
'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe',
'TestDisk': 'https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip',
'TreeSizeFree': 'https://www.jam-software.com/treesize_free/TreeSizeFree-Portable.zip',
'wimlib32': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip',
'wimlib64': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-bin.zip',
'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip',
'XMPlay 7z': 'http://support.xmplay.com/files/16/xmp-7z.zip?v=800962',
'XMPlay Game': 'http://support.xmplay.com/files/12/xmp-gme.zip?v=515637',
'XMPlay RAR': 'http://support.xmplay.com/files/16/xmp-rar.zip?v=409646',
'XMPlay WAModern': 'http://support.xmplay.com/files/10/WAModern.zip?v=207099',
'XMPlay': 'http://support.xmplay.com/files/20/xmplay3823.zip?v=115916',
'XYplorerFree': 'https://www.xyplorer.com/download/xyplorer_free_noinstall.zip',
'aria2': 'https://github.com/aria2/aria2/releases/download/release-1.33.1/aria2-1.33.1-win-32bit-build1.zip',
}
VCREDIST_SOURCES = {
'2008sp1': {
'32': 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe',
'64': 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe',
},
'2010sp1': {
'32': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe',
'64': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe',
},
'2012u4': {
'32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe',
'64': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe',
},
'2013': {
'32': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x86.exe',
'64': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x64.exe',
},
'2017': {
'32': 'https://download.visualstudio.microsoft.com/download/pr/11100229/78c1e864d806e36f6035d80a0e80399e/VC_redist.x86.exe',
'64': 'https://download.visualstudio.microsoft.com/download/pr/11100230/15ccb3f02745c7b206ad10373cbca89b/VC_redist.x64.exe',
},
}
NINITE_SOURCES = {
'Bundles': {
'Runtimes.exe': '.net4.7-air-java8-silverlight',
'Legacy.exe': '.net4.7-7zip-air-chrome-firefox-java8-silverlight-vlc',
'Modern.exe': '.net4.7-7zip-air-chrome-classicstart-firefox-java8-silverlight-vlc',
},
'Audio-Video': {
'AIMP.exe': 'aimp',
'Audacity.exe': 'audacity',
'CCCP.exe': 'cccp',
'Foobar2000.exe': 'foobar',
'GOM.exe': 'gom',
'HandBrake.exe': 'handbrake',
'iTunes.exe': 'itunes',
'K-Lite Codecs.exe': 'klitecodecs',
'MediaMonkey.exe': 'mediamonkey',
'MusicBee.exe': 'musicbee',
'Spotify.exe': 'spotify',
'VLC.exe': 'vlc',
'Winamp.exe': 'winamp',
},
'Cloud Storage': {
'Dropbox.exe': 'dropbox',
'Google Backup & Sync.exe': 'googlebackupandsync',
'Mozy.exe': 'mozy',
'OneDrive.exe': 'onedrive',
'SugarSync.exe': 'sugarsync',
},
'Communication': {
'Pidgin.exe': 'pidgin',
'Skype.exe': 'skype',
'Trillian.exe': 'trillian',
},
'Compression': {
'7-Zip.exe': '7zip',
'PeaZip.exe': 'peazip',
'WinRAR.exe': 'winrar',
},
'Developer': {
'Eclipse.exe': 'eclipse',
'FileZilla.exe': 'filezilla',
'JDK 8.exe': 'jdk8',
'JDK 8 (x64).exe': 'jdkx8',
'Notepad++.exe': 'notepadplusplus',
'PuTTY.exe': 'putty',
'Python 2.exe': 'python',
'Visual Studio Code.exe': 'vscode',
'WinMerge.exe': 'winmerge',
'WinSCP.exe': 'winscp',
},
'File Sharing': {
'qBittorrent.exe': 'qbittorrent',
},
'Image-Photo': {
'Blender.exe': 'blender',
'FastStone.exe': 'faststone',
'GIMP.exe': 'gimp',
'Greenshot.exe': 'greenshot',
'Inkscape.exe': 'inkscape',
'IrfanView.exe': 'irfanview',
'Krita.exe': 'krita',
'Paint.NET.exe': 'paint.net',
'ShareX.exe': 'sharex',
'XnView.exe': 'xnview',
},
'Misc': {
'Evernote.exe': 'evernote',
'Everything.exe': 'everything',
'KeePass 2.exe': 'keepass2',
'Google Earth.exe': 'googleearth',
'NV Access.exe': 'nvda',
'Steam.exe': 'steam',
},
'Office': {
'CutePDF.exe': 'cutepdf',
'Foxit Reader.exe': 'foxit',
'LibreOffice.exe': 'libreoffice',
'OpenOffice.exe': 'openoffice',
'PDFCreator.exe': 'pdfcreator',
'SumatraPDF.exe': 'sumatrapdf',
'Thunderbird.exe': 'thunderbird',
},
'Runtimes': {
'Adobe Air.exe': 'air',
'dotNET.exe': '.net4.7',
'Java 8.exe': 'java8',
'Shockwave.exe': 'shockwave',
'Silverlight.exe': 'silverlight',
},
'Security': {
'Avast.exe': 'avast',
'AVG.exe': 'avg',
'Avira.exe': 'avira',
'Microsoft Security Essentials.exe': 'essentials',
'Malwarebytes Anti-Malware.exe': 'malwarebytes',
'Spybot 2.exe': 'spybot2',
'SUPERAntiSpyware.exe': 'super',
},
'Utilities': {
'CDBurnerXP.exe': 'cdburnerxp',
'Classic Start.exe': 'classicstart',
'Glary Utilities.exe': 'glary',
'ImgBurn.exe': 'imgburn',
'InfraRecorder.exe': 'infrarecorder',
'Launchy.exe': 'launchy',
'RealVNC.exe': 'realvnc',
'Revo Uninstaller.exe': 'revo',
'TeamViewer 12.exe': 'teamviewer12',
'TeraCopy.exe': 'teracopy',
'WinDirStat.exe': 'windirstat',
},
'Web Browsers': {
'Google Chrome.exe': 'chrome',
'Mozilla Firefox.exe': 'firefox',
'Opera Chromium.exe': 'operaChromium',
},
}
RST_SOURCES = {
#SetupRST_12.0.exe : Removed from download center?
#SetupRST_12.5.exe : Removed from download center?
#SetupRST_12.8.exe : Removed from download center?
'SetupRST_12.9.exe': 'https://downloadmirror.intel.com/23496/eng/SetupRST.exe',
#SetupRST_13.x.exe : Broken, doesn't support > .NET 4.5
'SetupRST_14.0.exe': 'https://downloadmirror.intel.com/25091/eng/SetupRST.exe',
'SetupRST_14.8.exe': 'https://downloadmirror.intel.com/26759/eng/setuprst.exe',
'SetupRST_15.8.exe': 'https://downloadmirror.intel.com/27147/eng/SetupRST.exe',
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,55 +0,0 @@
# Wizard Kit: Settings - Tools
TOOLS = {
# NOTE: BinDir will be prepended to these paths at runtime
'AIDA64': {
'32': r'AIDA64\aida64.exe'},
'AutoRuns': {
'32': r'Autoruns\autoruns.exe',
'64': r'Autoruns\autoruns64.exe'},
'BleachBit': {
'32': r'BleachBit\bleachbit_console.exe'},
'Caffeine': {
'32': r'Caffeine\caffeine.exe'},
'Du': {
'32': r'Du\du.exe',
'64': r'Du\du64.exe'},
'ERUNT': {
'32': r'ERUNT\ERUNT.EXE'},
'Everything': {
'32': r'Everything\Everything.exe',
'64': r'Everything\Everything64.exe'},
'FastCopy': {
'32': r'FastCopy\FastCopy.exe',
'64': r'FastCopy\FastCopy64.exe'},
'HitmanPro': {
'32': r'HitmanPro\HitmanPro.exe',
'64': r'HitmanPro\HitmanPro64.exe'},
'HWiNFO': {
'32': r'HWiNFO\HWiNFO.exe',
'64': r'HWiNFO\HWiNFO64.exe'},
'KVRT': {
'32': r'KVRT\KVRT.exe'},
'NotepadPlusPlus': {
'32': r'NotepadPlusPlus\notepadplusplus.exe'},
'ProduKey': {
'32': r'ProduKey\ProduKey.exe',
'64': r'ProduKey\ProduKey64.exe'},
'PuTTY-PSFTP': {
'32': r'PuTTY\PSFTP.EXE'},
'RKill': {
'32': r'RKill\RKill.exe'},
'SevenZip': {
'32': r'7-Zip\7za.exe',
'64': r'7-Zip\7za64.exe'},
'TDSSKiller': {
'32': r'TDSSKiller\TDSSKiller.exe'},
'wimlib-imagex': {
'32': r'wimlib\x32\wimlib-imagex.exe',
'64': r'wimlib\x64\wimlib-imagex.exe'},
'XMPlay': {
'32': r'XMPlay\xmplay.exe'},
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,39 +0,0 @@
# Wizard Kit: Check, and possibly repair, system file health via SFC
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.repairs import *
init_global_vars()
os.system('title {}: SFC Tool'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\SFC Tool.log'.format(**global_vars)
if __name__ == '__main__':
try:
stay_awake()
os.system('cls')
print_info('{}: SFC Tool\n'.format(KIT_NAME_FULL))
other_results = {
'Error': {
'CalledProcessError': 'Unknown Error',
},
'Warning': {
'GenericRepair': 'Repaired',
}}
if ask('Run a SFC scan now?'):
try_and_print(message='SFC scan...',
function=run_sfc_scan, other_results=other_results)
else:
abort()
# Done
print_standard('\nDone.')
pause('Press Enter to exit...')
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,106 +0,0 @@
# Wizard Kit: System Checklist
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.cleanup import *
from functions.diags import *
from functions.info import *
from functions.product_keys import *
from functions.setup import *
init_global_vars()
os.system('title {}: System Checklist Tool'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\System Checklist.log'.format(**global_vars)
if __name__ == '__main__':
try:
stay_awake()
os.system('cls')
print_info('{}: System Checklist Tool\n'.format(KIT_NAME_FULL))
ticket_number = get_ticket_number()
other_results = {
'Error': {
'CalledProcessError': 'Unknown Error',
'BIOSKeyNotFoundError': 'BIOS key not found',
},
'Warning': {}}
print_info('Starting System Checklist for Ticket #{}\n'.format(
ticket_number))
# Configure
print_info('Configure')
if global_vars['OS']['Version'] == '10':
try_and_print(message='Explorer...',
function=config_explorer_system, cs='Done')
try_and_print(message='Updating Clock...',
function=update_clock, cs='Done')
# Cleanup
print_info('Cleanup')
try_and_print(message='Desktop...',
function=cleanup_desktop, cs='Done')
try_and_print(message='AdwCleaner...',
function=cleanup_adwcleaner, cs='Done')
# Export system info
print_info('Backup System Information')
try_and_print(message='AIDA64 reports...',
function=run_aida64, cs='Done')
try_and_print(message='File listing...',
function=backup_file_list, cs='Done')
try_and_print(message='Power plans...',
function=backup_power_plans, cs='Done')
try_and_print(message='Product Keys...',
function=run_produkey, cs='Done')
try_and_print(message='Registry...',
function=backup_registry, cs='Done')
# User data
print_info('User Data')
show_user_data_summary()
# Summary
print_info('Summary')
try_and_print(message='Operating System:',
function=show_os_name, ns='Unknown', silent_function=False)
try_and_print(message='Activation:',
function=show_os_activation, ns='Unknown', silent_function=False)
if (not windows_is_activated()
and global_vars['OS']['Version'] in ('8', '10')):
try_and_print(message='BIOS Activation:',
function=activate_windows_with_bios,
other_results=other_results)
try_and_print(message='Installed Office:',
function=get_installed_office, ns='Unknown', print_return=True)
show_free_space()
try_and_print(message='Installed RAM:',
function=show_installed_ram, ns='Unknown', silent_function=False)
# Upload info
if ENABLED_UPLOAD_DATA:
print_info('Finalizing')
try_and_print(message='Compressing Info...',
function=compress_info, cs='Done')
try_and_print(message='Uploading to NAS...',
function=upload_info, cs='Done')
# Play audio, show devices, open Windows updates, and open Activation
popen_program(['mmc', 'devmgmt.msc'])
run_hwinfo_sensors()
popen_program(['control', '/name', 'Microsoft.WindowsUpdate'])
if not windows_is_activated():
popen_program('slui')
sleep(3)
run_xmplay()
# Done
print_standard('\nDone.')
pause('Press Enter exit...')
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,123 +0,0 @@
# Wizard Kit: System Diagnostics
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.browsers import *
from functions.diags import *
from functions.info import *
from functions.product_keys import *
from functions.repairs import *
init_global_vars()
os.system('title {}: System Diagnostics Tool'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\System Diagnostics.log'.format(
**global_vars)
if __name__ == '__main__':
try:
stay_awake()
os.system('cls')
print_info('{}: System Diagnostics Tool\n'.format(KIT_NAME_FULL))
ticket_number = get_ticket_number()
other_results = {
'Error': {
'CalledProcessError': 'Unknown Error',
},
'Warning': {
'GenericRepair': 'Repaired',
'UnsupportedOSError': 'Unsupported OS',
}}
print_info('Starting System Diagnostics for Ticket #{}\n'.format(
ticket_number))
# Sanitize Environment
print_info('Sanitizing Environment')
try_and_print(message='Killing processes...',
function=run_process_killer, cs='Done')
try_and_print(message='Running RKill...',
function=run_rkill, cs='Done')
try_and_print(message='Running TDSSKiller...',
function=run_tdsskiller, cs='Done')
# Re-run if earlier process was stopped.
stay_awake()
# Start diags
print_info('Starting Background Scans')
check_connection()
try_and_print(message='Running HitmanPro...',
function=run_hitmanpro, cs='Started')
try_and_print(message='Running Autoruns...',
function=run_autoruns, cs='Started')
# OS Health Checks
print_info('OS Health Checks')
try_and_print(
message='CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env']),
function=run_chkdsk, other_results=other_results)
try_and_print(message='SFC scan...',
function=run_sfc_scan, other_results=other_results)
try_and_print(message='DISM CheckHealth...',
function=run_dism, other_results=other_results, repair=False)
# Scan for supported browsers
print_info('Scanning for browsers')
scan_for_browsers()
# Export system info
print_info('Backup System Information')
try_and_print(message='AIDA64 reports...',
function=run_aida64, cs='Done')
try_and_print(message='BleachBit report...',
function=run_bleachbit, cs='Done')
backup_browsers()
try_and_print(message='File listing...',
function=backup_file_list, cs='Done')
try_and_print(message='Power plans...',
function=backup_power_plans, cs='Done')
try_and_print(message='Product Keys...',
function=run_produkey, cs='Done')
try_and_print(message='Registry...',
function=backup_registry, cs='Done')
# Summary
print_info('Summary')
try_and_print(message='Temp Size:',
function=show_temp_files_size, silent_function=False)
show_free_space()
try_and_print(message='Installed RAM:',
function=show_installed_ram, ns='Unknown', silent_function=False)
try_and_print(message='Installed Office:',
function=get_installed_office, ns='Unknown', print_return=True)
try_and_print(message='Product Keys:',
function=get_product_keys, ns='Unknown', print_return=True)
try_and_print(message='Operating System:',
function=show_os_name, ns='Unknown', silent_function=False)
try_and_print(message='',
function=show_os_activation, ns='Unknown', silent_function=False)
# User data
print_info('User Data')
try:
show_user_data_summary()
except Exception:
print_error(' Unknown error.')
# Upload info
print_info('Finalizing')
try_and_print(message='Compressing Info...',
function=compress_info, cs='Done')
try_and_print(message='Uploading to NAS...',
function=upload_info, cs='Done')
# Done
print_standard('\nDone.')
pause('Press Enter to exit...')
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,28 +0,0 @@
# Wizard Kit: Search for product keys in the transfer folder
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.product_keys import *
init_global_vars()
os.system('title {}: Transferred Key Finder'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\Transferred Keys.log'.format(**global_vars)
if __name__ == '__main__':
try:
stay_awake()
os.system('cls')
print_info('{}: Transferred Key Finder\n'.format(KIT_NAME_FULL))
try_and_print(message='Searching for keys...',
function=list_clientdir_keys, print_return=True)
# Done
print_standard('\nDone.')
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,142 +0,0 @@
# Wizard Kit: Download the latest versions of the programs in the kit
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.update import *
init_global_vars()
os.system('title {}: Kit Update Tool'.format(KIT_NAME_FULL))
if __name__ == '__main__':
try:
os.system('cls')
print_info('{}: Kit Update Tool\n'.format(KIT_NAME_FULL))
other_results = {
'Error': {
'CalledProcessError': 'Unknown Error',
}}
## Prep ##
update_sdio = ask('Update SDI Origin?')
## Download ##
print_success('Downloading tools')
# Data Recovery
print_info(' Data Recovery')
try_and_print(message='TestDisk / PhotoRec...', function=update_testdisk, other_results=other_results, width=40)
# Data Transfers
print_info(' Data Transfers')
try_and_print(message='FastCopy...', function=update_fastcopy, other_results=other_results, width=40)
try_and_print(message='wimlib...', function=update_wimlib, other_results=other_results, width=40)
try_and_print(message='XYplorer...', function=update_xyplorer, other_results=other_results, width=40)
# Diagnostics
print_info(' Diagnostics')
try_and_print(message='AIDA64...', function=update_aida64, other_results=other_results, width=40)
try_and_print(message='Autoruns...', function=update_autoruns, other_results=other_results, width=40)
try_and_print(message='BleachBit...', function=update_bleachbit, other_results=other_results, width=40)
try_and_print(message='BlueScreenView...', function=update_bluescreenview, other_results=other_results, width=40)
try_and_print(message='ERUNT...', function=update_erunt, other_results=other_results, width=40)
try_and_print(message='HitmanPro...', function=update_hitmanpro, other_results=other_results, width=40)
try_and_print(message='HWiNFO...', function=update_hwinfo, other_results=other_results, width=40)
try_and_print(message='ProduKey...', function=update_produkey, other_results=other_results, width=40)
# Drivers
print_info(' Drivers')
try_and_print(message='Intel RST...', function=update_intel_rst, other_results=other_results, width=40)
try_and_print(message='Intel SSD Toolbox...', function=update_intel_ssd_toolbox, other_results=other_results, width=40)
try_and_print(message='Samsing Magician...', function=update_samsung_magician, other_results=other_results, width=40)
if update_sdio:
try_and_print(message='Snappy Driver Installer Origin...', function=update_sdi_origin, other_results=other_results, width=40)
# Installers
print_info(' Installers')
try_and_print(message='Adobe Reader DC...', function=update_adobe_reader_dc, other_results=other_results, width=40)
try_and_print(message='MS Office...', function=update_office, other_results=other_results, width=40)
try_and_print(message='Visual C++ Runtimes...', function=update_vcredists, other_results=other_results, width=40)
update_all_ninite(other_results=other_results, width=40)
# Misc
print_info(' Misc')
try_and_print(message='Caffeine...', function=update_caffeine, other_results=other_results, width=40)
try_and_print(message='Classic Start Skin...', function=update_classic_start_skin, other_results=other_results, width=40)
try_and_print(message='Du...', function=update_du, other_results=other_results, width=40)
try_and_print(message='Everything...', function=update_everything, other_results=other_results, width=40)
try_and_print(message='PuTTY...', function=update_putty, other_results=other_results, width=40)
try_and_print(message='Notepad++...', function=update_notepadplusplus, other_results=other_results, width=40)
try_and_print(message='TreeSizeFree...', function=update_treesizefree, other_results=other_results, width=40)
try_and_print(message='XMPlay...', function=update_xmplay, other_results=other_results, width=40)
# Repairs
print_info(' Repairs')
try_and_print(message='AdwCleaner...', function=update_adwcleaner, other_results=other_results, width=40)
try_and_print(message='KVRT...', function=update_kvrt, other_results=other_results, width=40)
try_and_print(message='RKill...', function=update_rkill, other_results=other_results, width=40)
try_and_print(message='TDSSKiller...', function=update_tdsskiller, other_results=other_results, width=40)
# Uninstallers
print_info(' Uninstallers')
try_and_print(message='IObit Uninstaller...', function=update_iobit_uninstaller, other_results=other_results, width=40)
## Review ##
print_standard('Please review the results and download/extract any missing items to .cbin')
pause('Press Enter to compress the .cbin items')
## Compress ##
print_success('Compressing tools')
print_info(' _Drivers')
for item in os.scandir(r'{}\_Drivers'.format(global_vars['CBinDir'])):
if not re.search(r'^(_Drivers|.*7z)$', item.name, re.IGNORECASE):
try_and_print(
message='{}...'.format(item.name),
function=compress_and_remove_item,
other_results = other_results,
width=40,
item = item)
print_info(' .cbin')
for item in os.scandir(global_vars['CBinDir']):
if not re.search(r'^(_Drivers|_include|.*7z)$', item.name, re.IGNORECASE):
try_and_print(
message='{}...'.format(item.name),
function=compress_and_remove_item,
other_results = other_results,
width=40,
item = item)
## Search for network Office/QuickBooks installers & add to LAUNCHERS
print_success('Scanning for network installers')
scan_for_net_installers(OFFICE_SERVER, 'Office', min_year=2010)
scan_for_net_installers(QUICKBOOKS_SERVER, 'QuickBooks', min_year=2015)
## Generate Launchers
print_success('Generating launchers')
for section in sorted(LAUNCHERS.keys()):
print_info(' {}'.format(section))
for name, options in sorted(LAUNCHERS[section].items()):
try_and_print(message=name, function=generate_launcher,
section=section, name=name, options=options,
other_results=other_results, width=40)
# Rename "Copy WizardKit.cmd" (if necessary)
source = r'{}\Scripts\Copy WizardKit.cmd'.format(global_vars['BinDir'])
dest = r'{}\Copy {}.cmd'.format(global_vars['BaseDir'], KIT_NAME_FULL)
if os.path.exists(source):
try:
shutil.move(source, dest)
except Exception:
print_error(' Failed to rename "{}.cmd" to "{}.cmd"'.format(
'Copy WizardKit', KIT_NAME_FULL))
# Done
print_standard('\nDone.')
pause("Press Enter to exit...")
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,83 +0,0 @@
# Wizard Kit: User Checklist
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.browsers import *
from functions.cleanup import *
from functions.setup import *
init_global_vars()
os.system('title {}: User Checklist Tool'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\User Checklist ({USERNAME}).log'.format(
**global_vars, **global_vars['Env'])
if __name__ == '__main__':
try:
stay_awake()
os.system('cls')
print_info('{}: User Checklist\n'.format(KIT_NAME_FULL))
other_results = {
'Warning': {
'NotInstalledError': 'Not installed',
'NoProfilesError': 'No profiles found',
}}
answer_config_browsers = ask('Install adblock?')
if answer_config_browsers:
answer_reset_browsers = ask(
'Reset browsers to safe defaults first?')
if global_vars['OS']['Version'] == '10':
answer_config_classicshell = ask('Configure ClassicShell?')
answer_config_explorer_user = ask('Configure Explorer?')
# Cleanup
print_info('Cleanup')
try_and_print(message='Desktop...',
function=cleanup_desktop, cs='Done')
# Scan for supported browsers
print_info('Scanning for browsers')
scan_for_browsers()
# Homepages
print_info('Current homepages')
list_homepages()
# Backup
print_info('Backing up browsers')
backup_browsers()
# Reset
if answer_config_browsers and answer_reset_browsers:
print_info('Resetting browsers')
reset_browsers()
# Configure
print_info('Configuring programs')
if answer_config_browsers:
install_adblock()
if global_vars['OS']['Version'] == '10':
if answer_config_classicshell:
try_and_print(message='ClassicStart...',
function=config_classicstart, cs='Done')
if answer_config_explorer_user:
try_and_print(message='Explorer...',
function=config_explorer_user, cs='Done')
if (not answer_config_browsers
and not answer_config_classicshell
and not answer_config_explorer_user):
print_warning(' Skipped')
else:
if not answer_config_browsers:
print_warning(' Skipped')
# Done
print_standard('\nDone.')
pause('Press Enter to exit...')
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,53 +0,0 @@
# Wizard Kit: Copy user data to the system from a local or network source
import os
import sys
# Init
os.chdir(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(os.getcwd())
from functions.data import *
from functions.repairs import *
init_global_vars()
os.system('title {}: User Data Transfer Tool'.format(KIT_NAME_FULL))
global_vars['LogFile'] = r'{LogDir}\User Data Transfer.log'.format(**global_vars)
if __name__ == '__main__':
try:
# Prep
stay_awake()
os.system('cls')
print_info('{}: User Data Transfer Tool\n'.format(KIT_NAME_FULL))
ticket_number = get_ticket_number()
folder_path = r'{}\Transfer'.format(KIT_NAME_SHORT)
dest = select_destination(folder_path=folder_path,
prompt='Which disk are we transferring to?')
source = select_source(ticket_number)
items = scan_source(source, dest)
# Transfer
os.system('cls')
print_info('Transfer Details:\n')
show_info('Ticket:', ticket_number)
show_info('Source:', source.path)
show_info('Destination:', dest)
if (not ask('Proceed with transfer?')):
umount_backup_shares()
abort()
print_info('Transferring Data')
transfer_source(source, dest, items)
try_and_print(message='Removing extra files...',
function=cleanup_transfer, cs='Done')
umount_backup_shares()
# Done
run_kvrt()
print_standard('\nDone.')
pause("Press Enter to exit...")
exit_script()
except SystemExit:
pass
except:
major_exception()

View file

@ -1,99 +0,0 @@
InfoPage="Computer;Summary"
InfoPage="Computer;Computer Name"
InfoPage="Computer;DMI"
InfoPage="Computer;IPMI"
InfoPage="Computer;Overclock"
InfoPage="Computer;Power Management"
InfoPage="Computer;Portable Computer"
InfoPage="Motherboard;CPU"
InfoPage="Motherboard;CPUID"
InfoPage="Motherboard;Motherboard"
InfoPage="Motherboard;Memory"
InfoPage="Motherboard;SPD"
InfoPage="Motherboard;Chipset"
InfoPage="Motherboard;BIOS"
InfoPage="Motherboard;ACPI"
InfoPage="Operating System;Operating System"
InfoPage="Operating System;Processes"
InfoPage="Operating System;System Drivers"
InfoPage="Operating System;Services"
InfoPage="Operating System;AX Files"
InfoPage="Operating System;DLL Files"
InfoPage="Operating System;Certificates"
InfoPage="Operating System;UpTime"
InfoPage="Server;Share"
InfoPage="Server;Opened Files"
InfoPage="Server;Account Security"
InfoPage="Server;Logon"
InfoPage="Server;Users"
InfoPage="Server;Local Groups"
InfoPage="Server;Global Groups"
InfoPage="Display;Windows Video"
InfoPage="Display;PCI / AGP Video"
InfoPage="Display;GPU"
InfoPage="Display;Monitor"
InfoPage="Display;Desktop"
InfoPage="Display;Multi-Monitor"
InfoPage="Display;Video Modes"
InfoPage="Display;OpenGL"
InfoPage="Display;GPGPU"
InfoPage="Display;Mantle"
InfoPage="Display;Vulkan"
InfoPage="Display;Fonts"
InfoPage="Multimedia;Windows Audio"
InfoPage="Multimedia;PCI / PnP Audio"
InfoPage="Multimedia;HD Audio"
InfoPage="Multimedia;OpenAL"
InfoPage="Multimedia;Audio Codecs"
InfoPage="Multimedia;Video Codecs"
InfoPage="Multimedia;MCI"
InfoPage="Multimedia;SAPI"
InfoPage="Storage;Windows Storage"
InfoPage="Storage;Logical Drives"
InfoPage="Storage;Physical Drives"
InfoPage="Storage;Optical Drives"
InfoPage="Storage;ASPI"
InfoPage="Storage;ATA"
InfoPage="Storage;SMART"
InfoPage="Network;Windows Network"
InfoPage="Network;PCI / PnP Network"
InfoPage="Network;RAS"
InfoPage="Network;Net Resources"
InfoPage="Network;IAM"
InfoPage="Network;Internet"
InfoPage="Network;Routes"
InfoPage="Network;IE Cookie"
InfoPage="Network;Browser History"
InfoPage="DirectX;DirectX Files"
InfoPage="DirectX;DirectX Video"
InfoPage="DirectX;DirectX Sound"
InfoPage="Devices;Windows Devices"
InfoPage="Devices;Physical Devices"
InfoPage="Devices;PCI Devices"
InfoPage="Devices;USB Devices"
InfoPage="Devices;Device Resources"
InfoPage="Devices;Input"
InfoPage="Devices;Printers"
InfoPage="Software;Auto Start"
InfoPage="Software;Scheduled"
InfoPage="Software;Installed Programs"
InfoPage="Software;Licenses"
InfoPage="Software;File Types"
InfoPage="Software;Desktop Gadgets"
InfoPage="Security;Windows Security"
InfoPage="Security;Windows Update"
InfoPage="Security;Anti-Virus"
InfoPage="Security;Firewall"
InfoPage="Security;Anti-Spyware"
InfoPage="Security;Anti-Trojan"
InfoPage="Config;Regional"
InfoPage="Config;Environment"
InfoPage="Config;Control Panel"
InfoPage="Config;Recycle Bin"
InfoPage="Config;System Files"
InfoPage="Config;System Folders"
InfoPage="Config;Event Logs"
InfoPage="Database;Database Software"
InfoPage="Database;BDE Drivers"
InfoPage="Database;ODBC Drivers"
InfoPage="Database;ODBC Data Sources"

View file

@ -1 +0,0 @@
InfoPage="Software;Installed Programs"

View file

@ -1 +0,0 @@
InfoPage="Software;Licenses"

View file

@ -1,77 +0,0 @@
[Portable]
[bleachbit]
auto_hide = False
auto_start = False
check_beta = False
check_online_updates = False
shred = False
exit_done = False
delete_confirmation = True
units_iec = True
update_winapp2 = False
first_start = True
version = 1.17
[hashpath]
[list/shred_drives]
[preserve_languages]
en = True
[tree]
adobe_reader = True
adobe_reader.cache = True
adobe_reader.tmp = True
amule = True
amule.tmp = True
chromium = True
chromium.cache = True
firefox = True
firefox.cache = True
gimp = True
gimp.tmp = True
google_chrome = True
google_chrome.cache = True
google_earth = True
google_earth.temporary_files = True
hippo_opensim_viewer = True
hippo_opensim_viewer.cache = True
internet_explorer = True
internet_explorer.temporary_files = True
java = True
java.cache = True
libreoffice = True
libreoffice.cache = True
liferea = True
liferea.cache = True
miro = True
miro.cache = True
openofficeorg = True
openofficeorg.cache = True
opera = True
opera.cache = True
pidgin = True
pidgin.cache = True
safari = True
safari.cache = True
seamonkey = True
seamonkey.cache = True
secondlife_viewer = True
secondlife_viewer.Cache = True
system = True
system.recycle_bin = True
system.tmp = True
thunderbird = True
thunderbird.cache = True
vuze = True
vuze.cache = True
vuze.tmp = True
yahoo_messenger = True
yahoo_messenger.cache = True
winapp2_windows = True
winapp2_windows.cbs_logs = True
winapp2_windows.cbs_logs_more = True
winapp2_windows.windows_cbs_logs_more = True

File diff suppressed because it is too large Load diff

View file

@ -1 +0,0 @@
Broken. "requires" .NET 4.5 but fails to accept .NET 4.6 or newer (which we install).

View file

@ -1,7 +0,0 @@
<Configuration>
<Add OfficeClientEdition="32" Channel="Current">
<Product ID="O365ProPlusRetail">
<Language ID="en-us" />
</Product>
</Add>
</Configuration>

View file

@ -1,7 +0,0 @@
<Configuration>
<Add OfficeClientEdition="64" Channel="Current">
<Product ID="O365ProPlusRetail">
<Language ID="en-us" />
</Product>
</Add>
</Configuration>

View file

@ -1,7 +0,0 @@
<Configuration>
<Add OfficeClientEdition="32" Channel="Current">
<Product ID="HomeBusinessRetail">
<Language ID="en-us" />
</Product>
</Add>
</Configuration>

View file

@ -1,7 +0,0 @@
<Configuration>
<Add OfficeClientEdition="64" Channel="Current">
<Product ID="HomeBusinessRetail">
<Language ID="en-us" />
</Product>
</Add>
</Configuration>

View file

@ -1,7 +0,0 @@
<Configuration>
<Add OfficeClientEdition="32" Channel="Current">
<Product ID="HomeStudentRetail">
<Language ID="en-us" />
</Product>
</Add>
</Configuration>

View file

@ -1,7 +0,0 @@
<Configuration>
<Add OfficeClientEdition="64" Channel="Current">
<Product ID="HomeStudentRetail">
<Language ID="en-us" />
</Product>
</Add>
</Configuration>

View file

@ -1,22 +0,0 @@
@echo off
setlocal
start "" /wait "2008sp1\x32\vcredist.exe" /qb! /norestart
start "" /wait "2008sp1\x64\vcredist.exe" /qb! /norestart
start "" /wait "2010\x32\vcredist.exe" /passive /norestart
start "" /wait "2010\x64\vcredist.exe" /passive /norestart
start "" /wait "2012u4\x32\vcredist.exe" /passive /norestart
start "" /wait "2012u4\x64\vcredist.exe" /passive /norestart
start "" /wait "2013\x32\vcredist.exe" /install /passive /norestart
start "" /wait "2013\x64\vcredist.exe" /install /passive /norestart
start "" /wait "2015u3\x32\vcredist.exe" /install /passive /norestart
start "" /wait "2015u3\x64\vcredist.exe" /install /passive /norestart
start "" /wait "2017\x32\vcredist.exe" /install /passive /norestart
start "" /wait "2017\x64\vcredist.exe" /install /passive /norestart
endlocal

47
.gitignore vendored
View file

@ -1,39 +1,8 @@
**/__pycache__/*
*.bak
*.exe
.bin/7-Zip/
.bin/AIDA64/
.bin/BleachBit/
.bin/ClassicStartSkin/
.bin/ConEmu/
.bin/Erunt/
.bin/Everything/
.bin/FastCopy/
.bin/HWiNFO/HWiNFO*.ini
.bin/NotepadPlusPlus/
.bin/ProcessKiller/
.bin/ProduKey/
.bin/Python/
.bin/Tmp/
.bin/XMPlay/
.bin/_Drivers/SDIO/
.cbin/*.7z
.cbin/AIDA64/
.cbin/Autoruns/
.cbin/BleachBit-Portable/
.cbin/BlueScreenView/
.cbin/Caffeine/
.cbin/Du/
.cbin/Everything/
.cbin/FirefoxExtensions/
.cbin/IObitUninstallerPortable/
.cbin/ProduKey/
.cbin/TestDisk/
.cbin/TreeSizeFree-Portable/
.cbin/XMPlay/
.cbin/XYplorerFree/
.cbin/_Drivers/
.cbin/_Office/
.cbin/_vcredists/
.cbin/wimlib/
OUT*/
**/__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,2 +0,0 @@
[InternetShortcut]
URL=https://support.amd.com/en-us/download

View file

@ -1,2 +0,0 @@
[InternetShortcut]
URL=https://ftp.dell.com/browse_for_drivers/

View file

@ -1,2 +0,0 @@
[InternetShortcut]
URL=https://downloads.dell.com/published/Pages/index.html

View file

@ -1,6 +0,0 @@
[InternetShortcut]
URL=http://support.dell.com/
IDList=
HotKey=0
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
IDList=
URL=http://www.majorgeeks.com/files/details/device_remover_543c.html

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,11
[InternetShortcut]
IDList=
URL=https://www.wagnardsoft.com/

View file

@ -1,2 +0,0 @@
[InternetShortcut]
URL=http://support.hp.com/us-en/drivers

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,11
[InternetShortcut]
IDList=
URL=https://www.intel.com/content/www/us/en/support/detect.html

View file

@ -1,2 +0,0 @@
[InternetShortcut]
URL=https://www.nvidia.com/Download/index.aspx?lang=en-us

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
IDList=
URL=http://www.samsung.com/semiconductor/minisite/ssd/download/tools.html

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,11
[InternetShortcut]
URL=https://www.backblaze.com/gen/install_backblaze-af9duk
IDList=

View file

@ -1,6 +0,0 @@
Windows Registry Editor Version 5.00
;Delete entries acording to http://support.microsoft.com/kb/314060
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318}]
"UpperFilters"=-
"LowerFilters"=-

View file

@ -1,6 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
IDList=
URL=http://www.nirsoft.net/outlook_office_software.html
HotKey=0

View file

@ -1,6 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
IDList=
URL=http://www.nirsoft.net/password_recovery_tools.html
HotKey=0

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
IDList=
URL=http://live.sysinternals.com/

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://kb.eset.com/esetkb/index?page=content&id=SOLN146
IDList=

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://www.avg.com/us-en/utilities
IDList=

View file

@ -1,6 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://files.avast.com/iavs9x/avastclear.exe
IDList=
HotKey=0

View file

@ -1,6 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://dlpro.antivir.com/package/regcleaner/win32/en/avira_registry_cleaner_en.zip
IDList=
HotKey=0

View file

@ -1,6 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://download.eset.com/special/ESETUninstaller.exe
IDList=
HotKey=0

View file

@ -1,6 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://media.kaspersky.com/utilities/ConsumerUtilities/kavremvr.exe
IDList=
HotKey=0

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://www.malwarebytes.org/mbam-clean.exe
IDList=

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://download.mcafee.com/products/licensed/cust_support_patches/MCPR.exe
IDList=

View file

@ -1,5 +0,0 @@
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,1
[InternetShortcut]
URL=ftp://ftp.symantec.com/public/english_us_canada/removal_tools/Norton_Removal_Tool.exe
IDList=

View file

@ -1,63 +0,0 @@
:: Wizard Kit: Build Tool Launcher ::
@echo off
:Init
setlocal
title Wizard Kit: Build Tool
call :CheckFlags %*
:LaunchPrep
rem Verifies the environment before launching item
if not exist ".bin\Scripts\build_kit.ps1" (goto ErrorBuildKitMissing)
:PrepNewKit
rem Copy base files to a new folder OUT\%KIT_NAME_FULL%
robocopy /e . OUT /xd .git .root_items OUT /xf .gitignore "Build Kit.cmd" ConEmu.png
robocopy /e .root_items OUT
copy ConEmu.png OUT\.bin\ConEmu\
mkdir OUT\.cbin >nul 2>&1
attrib +h OUT\.bin >nul 2>&1
attrib +h OUT\.cbin >nul 2>&1
:Launch
rem Calls the Launch.cmd script using the variables defined above
set "file=OUT\.bin\Scripts\build_kit.ps1"
powershell -executionpolicy bypass -noprofile -file %file% || goto ErrorUnknown
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
:: Errors ::
:ErrorBuildKitMissing
echo.
echo ERROR: build_kit.ps1 script not found.
goto Abort
:ErrorUnknown
echo.
echo ERROR: Encountered an unknown error.
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%

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,38 +1,39 @@
# Wizard Kit #
A collection of scripts to help technicians service Windows systems.
## Requirements ##
* PowerShell 3.0 or newer
* 6 Gb disk space
## Initial Setup ##
* Replace ConEmu.png if desired
* Run `Build Kit.cmd` which will do the following:
* Download 7-Zip, ConEmu, Notepad++, and Python (including wheel packages)
* Open `.bin\Scripts\settings\main.py` in Notepad++ for configuration
* Update the rest of the tools with the `.bin\Scripts\update_kit.py` script
## Layout ##
* Root
* Main script launchers:
* `.bin`
* Extracted programs: As compressed tools are run they will be extracted here.
* `Scripts`
* "Real" scripts live here and are run via their respective launchers.
* `.cbin`
* This folder holds the compressed and encrypted tool archives.
* They are extracted at runtime as needed.
* `Data Recovery`
* This folder is not copied by `Copy WizardKit.cmd` to help discourage
* recovering data to the same drive.
* `Data Transfers`
* `Diagnostics`
* `Drivers`
* `Installers`
* `Misc`
* `Repairs`
* `Uninstallers`
# 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

View file

Before

Width:  |  Height:  |  Size: 113 KiB

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

View file

@ -1,4 +1,4 @@
:: Wizard Kit: Wrapper for launching programs and scripts.
:: WizardKit: Wrapper for launching programs and scripts.
::
:: Some features:
:: * If the OS is 64-bit then the WorkingDir is scanned for a 64-bit version of the programs
@ -10,7 +10,7 @@ if defined DEBUG (@echo on)
:Init
setlocal EnableDelayedExpansion
title Wizard Kit: Launcher
title WizardKit: Launcher
pushd "%~dp0"
call :FindBin
call :DeQuote L_ITEM
@ -19,39 +19,38 @@ call :DeQuote L_TYPE
:SetVariables
rem Set variables using settings\main.py file
set "SETTINGS=%bin%\Scripts\settings\main.py"
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!"
)
set "var=%%v"
for /f "tokens=* usebackq" %%f in (`findstr "!var!=" "%SETTINGS%"`) do (
set "_v=%%f"
set "_v=!_v:*'=!"
set "%%v=!_v:~0,-1!"
)
)
rem Set ARCH to 32 as a gross assumption and check for x86_64 status
set ARCH=32
if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" set "ARCH=64"
set "SEVEN_ZIP=%bin%\7-Zip\7za.exe"
set "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 "SEVEN_ZIP=%bin%\7-Zip\7za64.exe"
set "CON=%bin%\ConEmu\ConEmu64.exe"
set "FASTCOPY=%bin%\FastCopy\FastCopy64.exe"
set "PYTHON=%bin%\Python\x64\python.exe"
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%
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%
set "window_title=%*"
if not defined window_title set "window_title=Launcher"
set "window_title=%KIT_NAME_FULL%: %window_title%"
title %window_title%
)
:CheckUsage
@ -66,28 +65,28 @@ 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 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
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)
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
@ -97,7 +96,9 @@ 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.%"
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
@ -105,9 +106,9 @@ rem Run
popd && pushd "%_path%"
if defined L__CLI goto LaunchExecutableCLI
if defined L_ELEV (
goto LaunchExecutableElev
goto LaunchExecutableElev
) else (
goto LaunchExecutableUser
goto LaunchExecutableUser
)
:LaunchExecutableCLI
@ -150,20 +151,20 @@ goto Exit
:LaunchOffice
call "%bin%\Scripts\init_client_dir.cmd" /Office
set "_odt=False"
if %L_PATH% equ 2013 (set "_odt=True")
if %L_PATH% equ 2016 (set "_odt=True")
if %L_PATH% equ 2019 (set "_odt=True")
if "%_odt%" == "True" (
goto LaunchOfficeODT
goto LaunchOfficeODT
) else (
goto LaunchOfficeSetup
goto LaunchOfficeSetup
)
:LaunchOfficeODT
rem Prep
set "args=-aoa -bso0 -bse0 -bsp0 -p%ARCHIVE_PASSWORD%"
set "config=%L_ITEM%"
set "dest=%client_dir%\Office\%L_PATH%"
set "odt_exe=%L_PATH%\setup.exe"
set "dest=%client_dir%\Office\ODT"
set "odt_exe=setup.exe"
set "source=%cbin%\_Office.7z"
rem Extract
@ -202,14 +203,14 @@ 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
start "" "%dest%\%product_name%\setup.exe" || goto ErrorUnknown
) else if "%product_name:~-3,3%" == "exe" (
start "" "%dest%\%product_name%" || goto ErrorUnknown
start "" "%dest%\%product_name%" || goto ErrorUnknown
) else if "%product_name:~-3,3%" == "msi" (
start "" "%dest%\%product_name%" || goto ErrorUnknown
start "" "%dest%\%product_name%" || goto ErrorUnknown
) else (
rem Office source not supported by this script
goto ErrorOfficeUnsupported
rem Office source not supported by this script
goto ErrorOfficeUnsupported
)
goto Exit
@ -225,9 +226,9 @@ if not exist "%script%" goto ErrorScriptNotFound
rem Run
popd && pushd "%_path%"
if defined L_ELEV (
goto LaunchPSScriptElev
goto LaunchPSScriptElev
) else (
goto LaunchPSScriptUser
goto LaunchPSScriptUser
)
:LaunchPSScriptElev
@ -238,10 +239,10 @@ 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"
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"
echo UAC.ShellExecute "%CON%", "-run %POWERSHELL% %ps_args% -File "^"%script%^"" -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
)
rem Run
@ -251,9 +252,9 @@ goto Exit
:LaunchPSScriptUser
rem Run
if defined L_NCMD (
start "" "%POWERSHELL%" %ps_args% -File "%script%" || goto ErrorUnknown
start "" "%POWERSHELL%" %ps_args% -File "%script%" || goto ErrorUnknown
) else (
start "" "%CON%" -run "%POWERSHELL%" %ps_args% -File "%script%" -new_console:n || goto ErrorUnknown
start "" "%CON%" -run "%POWERSHELL%" %ps_args% -File "%script%" -new_console:n || goto ErrorUnknown
)
goto Exit
@ -263,13 +264,14 @@ 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
goto LaunchPyScriptElev
) else (
goto LaunchPyScriptUser
goto LaunchPyScriptUser
)
:LaunchPyScriptElev
@ -280,9 +282,9 @@ 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%", "", "runas", 3 >> "%bin%\tmp\Elevate.vbs"
echo UAC.ShellExecute "%PYTHON%", """%script%"" %L_ARGS%", "", "runas", 3 >> "%bin%\tmp\Elevate.vbs"
) else (
echo UAC.ShellExecute "%CON%", "-run %PYTHON% %script% -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
echo UAC.ShellExecute "%CON%", "-run ""%PYTHON%"" ""%script%"" %L_ARGS% -new_console:n", "", "runas", 1 >> "%bin%\tmp\Elevate.vbs"
)
rem Run
@ -291,9 +293,9 @@ goto Exit
:LaunchPyScriptUser
if defined L_NCMD (
start "" "%PYTHON%" "%script%" || goto ErrorUnknown
start "" "%PYTHON%" "%script%" %L_ARGS% || goto ErrorUnknown
) else (
start "" "%CON%" -run "%PYTHON%" "%script%" -new_console:n || goto ErrorUnknown
start "" "%CON%" -run "%PYTHON%" "%script%" %L_ARGS% -new_console:n || goto ErrorUnknown
)
goto Exit
@ -316,12 +318,12 @@ 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
pushd "%dest%\%product_name%"
start "" "%dest%\%product_name%\Setup.exe" || goto ErrorUnknown
popd
) else (
rem QuickBooks source not supported by this script
goto ErrorQuickBooksUnsupported
rem QuickBooks source not supported by this script
goto ErrorQuickBooksUnsupported
)
goto Exit
@ -330,16 +332,16 @@ 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 [L_7ZIP] [L_ELEV] [L_NCMD]
echo. QuickBooks Year Product [L_7ZIP]
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.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
@ -391,15 +393,15 @@ set "%1=%_tmp%"
: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 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
call :ExtractCBin
) else if exist "%cbin%\%L_PATH%\%L_ITEM:~0,-4%.7z" (
call :ExtractCBin
call :ExtractCBin
)
if exist "%bin%\%L_PATH%" (set "_path=%bin%\%L_PATH%")
if not defined _path (set "_path=%L_PATH%")
@ -435,6 +437,16 @@ 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.
@ -465,9 +477,9 @@ goto Abort
:Abort
rem Handle color theme for both the native console and ConEmu
if defined ConEmuBuild (
color c4
color c4
) else (
color 4e
color 4e
)
echo Aborted.
echo.
@ -486,11 +498,11 @@ 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
color 07
goto Exit
:: Cleanup and exit ::
:Exit
popd
endlocal
exit /b %errorlevel%
exit /b %errorlevel%

View file

@ -1,4 +1,4 @@
:: Wizard Kit: Launcher Script ::
:: WizardKit: Launcher Script ::
::
:: This script works by setting env variables and then calling Launch.cmd
:: which inherits the variables. This bypasses batch file argument parsing
@ -7,7 +7,7 @@
:Init
setlocal EnableDelayedExpansion
title Wizard Kit: Launcher
title WizardKit: Launcher
call :CheckFlags %*
call :FindBin
call :SetTitle Launcher
@ -17,7 +17,7 @@ call :SetTitle Launcher
rem EXTRA_CODE
:DefineLaunch
:: See %bin%\SCripts\Launch.cmd for details under :Usage label
:: See %bin%\Scripts\Launch.cmd for details under :Usage label
set L_TYPE=
set L_PATH=
set L_ITEM=
@ -46,7 +46,7 @@ goto Exit
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")
if /i "%%f" == "/DEBUG" (@echo on & set "DEBUG=/DEBUG")
)
@exit /b 0
@ -67,12 +67,12 @@ popd
@exit /b 0
:SetTitle
rem Sets title using KIT_NAME_FULL from settings\main.py
set "SETTINGS=%bin%\Scripts\settings\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!"
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"
@ -110,4 +110,4 @@ goto Exit
:: Cleanup and exit ::
:Exit
endlocal
exit /b %errorlevel%
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()

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