Compare commits

...

1040 commits
dev ... dev-pe

Author SHA1 Message Date
c099a573f7
Remove macOS icon files 2024-07-07 09:32:06 -07:00
7d1988bba1
Move macOS icon files to archive
This avoids file name issues under Windows
2024-07-07 09:28:41 -07:00
492823e401
Add pause after MBAM 2024-06-13 12:01:24 -07:00
7250045662
Update launch_sdio.py 2024-06-12 20:57:46 -07:00
97bda374e3
Update Stress Tests and leave classic version 2024-06-12 20:57:26 -07:00
b9bf7221ff
Update Snappy network location 2024-06-12 20:52:27 -07:00
0da34b3342
Don't disable Open-Shell options under Win11
The newer versions are compatible (at least until 24H2)
2024-06-12 20:50:47 -07:00
ae8d59f7e1
Merge remote-tracking branch 'upstream/dev' into dev 2024-06-12 19:30:17 -07:00
6f965389c8
Include font cache files
Should hopefully reduce startup time due to matplotlib's initial font scans
2024-06-09 17:31:53 -07:00
570c34049c
Drop wezterm-terminfo package
* It was removed from the main repo
2024-06-09 17:31:18 -07:00
4fa4ac5893
Update theme 2024-06-09 15:34:09 -07:00
d3fb1d590c
Merge remote-tracking branch 'upstream/dev' into dev 2024-06-03 21:11:26 -07:00
eb77e26c6c
Merge branch 'dev-pe' into dev 2024-05-30 01:54:49 -07:00
1330befd13
Update PE setup sections 2024-05-30 01:51:58 -07:00
1dfaf47d12
Suppress SDIO output in AutoSetup 2024-05-29 15:20:21 -07:00
b2473181fd
Drop 32-bit tools in Windows scripts 2024-04-28 01:50:31 -07:00
27f87819f1
Refactor WinPE code for the current Windows ADK 2024-04-28 01:27:01 -07:00
4ef60d55ca
Merge remote-tracking branch 'upstream/dev' into dev 2024-04-27 20:53:13 -07:00
8dcbcfc6cb
Update config_explorer()
This should hopefully prevent new explorer windows from being opened and
instead just reload the shell
2024-04-21 19:11:37 -07:00
709ceef2b7
Fix bug preventing SDIO from launching 2024-04-01 20:08:46 -07:00
3ea7d987d1
Merge remote-tracking branch 'upstream/dev' into dev 2024-04-01 19:26:26 -07:00
5decffdf7a
Add ranger package 2024-03-30 17:52:04 -07:00
0b7710a11e
Switch to new theme: Journey's End 2024-03-30 17:51:01 -07:00
13785ab502
Add 'Secret Menu' to HW-Diags
*Begrudgingly
2024-03-28 20:43:38 -07:00
35286ddb8b
Fix imaging whole devices 2024-03-25 23:06:25 -07:00
703224d891
Merge remote-tracking branch 'upstream/dev' into dev 2024-03-25 23:06:14 -07:00
3cdcd29ef4
Merge remote-tracking branch 'upstream/dev' into dev 2024-03-25 22:56:13 -07:00
14086bba3d
Add Minimal Repairs preset
Addresses issue #52
2024-03-25 21:50:22 -07:00
26843e4b4b
Drop xf86-video-nouveau
Current recommendation is to use generic KMS options or the proprietary
driver for newer Nvidia GPUs.  We're not running GPU diags so it's fine
2024-03-25 21:34:39 -07:00
3eee8114dd
Switch to PCManFM from Thunar 2024-03-25 21:34:18 -07:00
ff53e120f4
Switch to NetSurf from Firefox
Firefox is very slow to launch and having a browser is just for quick references IMO.
2024-03-25 21:34:00 -07:00
2fdbd025c1
Drop hardinfo
Launch hw-info script from keyboard shortcut instead
2024-03-25 21:31:05 -07:00
f916916946
Removed unused packages 2024-03-25 21:27:56 -07:00
acb73d36bf
Drop opensuperclone
It can be re-added once it's fully working here.
2024-03-25 21:25:26 -07:00
ddd81702ab
Switch to adobe-source sans fonts 2024-03-25 21:23:01 -07:00
baae3bfaac
Replace mariadb-connector-c with mariadb-libs 2024-03-25 21:20:13 -07:00
4e20cfe7a5
Drop unused firmware packages 2024-03-25 21:18:22 -07:00
1ecd4232bc
Merge remote-tracking branch 'upstream/dev' into dev 2024-03-24 18:53:32 -07:00
e49138381d
Include unmounted partitions in volume report
Addresses #50
2024-03-24 18:07:19 -07:00
fe21d10c98
Avoid crash if ddrescue-tui is run offline 2024-03-23 23:06:17 -07:00
25b18ebabc
Merge remote-tracking branch 'upstream/dev' into dev 2024-03-23 22:37:30 -07:00
8fe18c9617
Initialize Python modules during startup
* This is not an ideal solution but I'm guessing it's here to stay...
2023-11-12 19:16:34 -08:00
b97e51fe65
Update AutoRepair presets
Addresses #49
2023-11-12 16:32:20 -08:00
41dba79e56
Merge remote-tracking branch 'upstream/dev' into dev 2023-11-11 19:53:50 -08:00
3f090ee968
Refactor SDIO sections
* Use the same code paths for the launcher and AutoSetup
* Local copy now has a different theme to differentiate
2023-11-11 17:45:28 -08:00
5bc29b1e6e
Update to Badeline theme 2023-11-11 16:45:08 -08:00
952f074cdd
Update WinRepairAIO presets 2023-11-11 16:44:36 -08:00
a72fce184c
Merge remote-tracking branch 'upstream/dev' into dev 2023-11-11 16:44:20 -08:00
1a38d91cf3
Merge remote-tracking branch 'upstream/dev' into dev 2023-11-11 15:53:18 -08:00
64d785ca11
Merge remote-tracking branch 'upstream/dev' into dev 2023-11-04 20:41:57 -07:00
86de552ec6
Add missing boot icon 2023-11-04 20:40:55 -07:00
40cb37dfd0
Fix Syslinux background (again) 2023-11-04 20:40:55 -07:00
22bf150de8
Drop unused boot option 2023-11-04 20:40:52 -07:00
903a47edf7
Restore 1201 boot setup 2023-11-04 20:39:55 -07:00
Techs
4c6b8b564a DMDE 2023-11-04 19:58:34 -07:00
57eecdeb9f
Merge branch 'dev' of ssh://1201.ddns.net:2222/1201/WizardKit into dev 2023-11-04 17:26:29 -07:00
c895b45572
Merge remote-tracking branch 'upstream/dev' into dev 2023-11-02 20:59:13 -07:00
0fd96c0074
Merge remote-tracking branch 'upstream/dev' into dev 2023-11-01 23:43:26 -07:00
25bb433014
Launch XMPlay using a playlist instead of folders 2023-10-29 19:56:23 -07:00
d80de4ac65
Fix Syslinux background 2023-10-27 22:39:39 -07:00
1ce6fddbaf
Merge remote-tracking branch 'upstream/dev' into dev 2023-10-27 22:18:05 -07:00
9d10d89b18
Merge remote-tracking branch 'upstream/dev' into dev 2023-10-22 19:55:37 -07:00
8a23c626dd
Add matplotlib to package list 2023-10-22 17:56:25 -07:00
1f38be9aea
Merge remote-tracking branch 'upstream/dev' into dev 2023-10-22 17:45:09 -07:00
9b5c453552
Refactor music sections 2023-10-22 15:46:49 -07:00
ab5766ff4f
Don't import graph under Windows 2023-10-22 02:04:47 -07:00
f0b2b5f0ee
Update Python-MariaDB version 2023-10-22 02:04:27 -07:00
a48b4a7b38
Remove UninstallView launcher 2023-10-22 01:57:33 -07:00
7c9f87c224
Merge remote-tracking branch 'upstream/dev' into dev 2023-10-21 23:40:39 -07:00
1beab4b4b4
Merge remote-tracking branch 'upstream/dev' into dev 2023-10-21 19:19:31 -07:00
dca6aa7154
Add missing Sysbench pass/fail logic 2023-10-14 19:29:01 -07:00
cfd502245c
Add CPU graph upload logic 2023-10-14 19:28:40 -07:00
eb07a93e20
Reduce lists of temps in CPU graph
This helps highlight the changes from low and high CPU loads.
2023-10-14 17:00:45 -07:00
1ede6ad93b
Export CPU temperature graph 2023-10-07 19:34:55 -07:00
a620d0f1ca
Merge remote-tracking branch 'upstream/dev' into dev 2023-10-07 16:48:06 -07:00
cc5407242b
Fix upload-logs script 2023-10-03 15:24:12 -07:00
997d039569
Switch to Matplotlib from Gnuplot 2023-10-01 20:58:18 -07:00
c3edfae2b1
Refactor Bitlocker export sections
Addresses issue #45
2023-09-23 21:30:08 -07:00
146b3304aa
Replace 'N/A' result in post_system_info()
Addresses issue #47
2023-09-23 16:46:15 -07:00
8cb9e6c840
Merge remote-tracking branch 'upstream/dev' into dev 2023-09-23 16:34:02 -07:00
eacbb885b3
Include link to EveryMac search
Addresses issue #34
2023-09-23 15:51:37 -07:00
f6fa922bb3
Open both mic and webcam tests
Addresses issue #46
2023-08-26 19:11:44 -07:00
9ec0a249dd
Add osTicket post to finalize_recovery() 2023-08-26 17:53:35 -07:00
ce1a4ed723
Merge remote-tracking branch 'upstream/dev' into dev 2023-08-26 17:40:26 -07:00
f216ba338a
Ignore more unused function args 2023-08-26 17:25:06 -07:00
657cc2e794
Merge remote-tracking branch 'upstream/dev' into dev 2023-08-26 17:24:00 -07:00
f9da0c04ec
Merge remote-tracking branch 'upstream/dev' into dev 2023-08-26 13:37:24 -07:00
f85940955a
Split wk/clone/ddrescue.py to match upstream 2023-08-20 16:07:32 -07:00
945338ca01
Add response color for money-related posts. 2023-07-23 15:50:11 -07:00
2e8d46fa26
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-16 18:08:10 -07:00
e1a29e4e38
Update authorized_keys 2023-07-12 13:04:05 -07:00
70bd04b999
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-12 13:00:15 -07:00
10eb638221
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-11 11:43:00 -07:00
fea809b199
Switch to Celeste theme 2023-07-11 11:38:39 -07:00
40aee20d23
Add ddrescue stats for each pass to OST post 2023-07-09 15:33:44 -07:00
456dce5685
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-09 13:59:50 -07:00
33fe7b3b9e
Include more details in ddrescue-tui OST posts 2023-07-09 13:19:47 -07:00
593cb405c5
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-09 00:17:26 -07:00
3acb8ab47b
Include WinPE details for Bitlocker export
Addresses issue #40
2023-07-08 23:39:16 -07:00
4faa1d4a02
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-08 23:27:55 -07:00
a07fbd7cba
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-08 19:00:50 -07:00
7c48d5e2ed
Disable open on hover for search highlights 2023-07-05 16:18:41 -07:00
6dde471bf5
Don't disable Chrome notifications by default.
Doing so can cause Chrome sync to break and need re-authentication.
2023-07-05 16:08:02 -07:00
38fed7756f
Don't run winget upgrade all by default 2023-07-05 16:04:16 -07:00
3747434d62
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-05 15:52:29 -07:00
0af8be2c47
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-05 15:51:24 -07:00
9fe43a2e02
Don't hide the taskbar search box in Auto Setup 2023-07-03 21:37:42 -07:00
d567acd930
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-03 21:34:37 -07:00
b107b413df
Ensure System Info is the first group if selected 2023-07-03 21:25:06 -07:00
67d448e0a0
Merge remote-tracking branch 'upstream/dev' into dev 2023-07-03 21:24:08 -07:00
96f55fd992
Don't prompt to run Auto Repairs if run recently
Added a Registry marker for the last Auto Repairs Run.  This is set
during end_session() regardless of the actual repairs run but it should
be good enough.

Addresses issue #33
2023-06-26 10:09:06 -07:00
7156578124
Add option to launch Auto Repairs from Auto Setup
Addresses issue #33
2023-06-26 09:47:40 -07:00
ea4942bbc4
Allow empty response when selecting ticket 2023-06-26 09:45:52 -07:00
0bda5c7a1c
Merge remote-tracking branch 'upstream/winget' into winget 2023-06-26 08:36:56 -07:00
aab821d93c
Update Prime95 source 2023-06-25 04:15:27 -07:00
b3e7b64116
Merge remote-tracking branch 'upstream/winget' into winget 2023-06-25 04:12:31 -07:00
5e6461c27f
Add missing Python dependency 2023-06-24 23:08:54 -07:00
3061475992
Merge remote-tracking branch 'upstream/dev' into dev 2023-06-24 23:08:27 -07:00
5bae674ed9
Add winget script and launcher 2023-06-24 20:48:05 -07:00
939ea79a15
Merge remote-tracking branch 'upstream/dev' into dev 2023-06-24 20:36:00 -07:00
998a1e98f5
List Bitlocker volumes in HW diags posts 2023-06-19 20:41:53 -07:00
c246fb5fdf
Merge remote-tracking branch 'upstream/dev' into dev 2023-06-17 20:46:57 -07:00
a3400d76f4
Merge remote-tracking branch 'upstream/dev' into dev 2023-06-17 20:14:25 -07:00
0bcdde0ffb
Add ticket and note panes to new TUI 2023-06-17 19:53:05 -07:00
9b51bcbdc3
Merge remote-tracking branch 'upstream/dev' into dev 2023-06-17 18:56:51 -07:00
7912958399
Merge remote-tracking branch 'upstream/dev' into dev 2023-06-17 18:38:49 -07:00
550731e9e9
Merge remote-tracking branch 'upstream/dev' into dev 2023-06-17 18:31:22 -07:00
81b0dad1d1
Merge remote-tracking branch 'upstream/dev' into dev 2023-06-17 18:27:05 -07:00
375fc3fcd0
Fix bugs related to new UI design 2023-06-11 19:57:34 -07:00
d545152d67
Merge remote-tracking branch 'upstream/dev' into dev 2023-06-11 19:07:23 -07:00
676666394b
Update SSH key for mipha.2shirt.work 2023-06-10 16:27:09 -07:00
9dc900c75e
Replace more pylint sections with ruff 2023-03-27 00:09:08 -07:00
aea1373df7
Merge remote-tracking branch 'upstream/dev' into dev 2023-03-26 23:57:41 -07:00
9953f3978c
Merge remote-tracking branch 'upstream/dev' into dev 2023-03-26 23:22:34 -07:00
b304475011
Adjust HW Diagnostics top text handling 2023-03-05 16:32:57 -08:00
127b1bef52
Merge remote-tracking branch 'upstream/dev' into dev 2023-02-18 15:04:22 -08:00
e9f210567c
Merge remote-tracking branch 'upstream/dev' into dev 2023-02-16 16:48:19 -08:00
16281d4ce1
Merge remote-tracking branch 'upstream/dev' into dev 2023-02-15 17:37:57 -08:00
ee96dc087a
Fix disabling Open-Shell options under Windows 11 2023-02-15 17:36:56 -08:00
67fff6d1a5
Leave Apply ITS Settings unchecked by default 2023-02-14 17:51:10 -08:00
dfecfa637d
Make Open-Shell optional
Addresses issue #36
2023-02-14 14:13:56 -08:00
f289ce21c7
New artwork for Super Purdy Build Plus 2023-02-08 23:16:23 -08:00
cf068826f3
Add DeviceCleanup and DDU launchers 2023-02-07 16:15:57 -08:00
7d51112571
Merge remote-tracking branch 'upstream/dev' into dev 2023-02-07 16:10:10 -08:00
93bfa04917
Wait for MBAM install to complete 2023-02-06 20:48:50 -08:00
191549f88f
Add python packaging to the windows build script 2023-02-06 18:51:00 -08:00
8719f18f47
Add python-packaging
It's an unlisted dependency for python-mariadb-connector
2023-02-06 18:39:35 -08:00
a40c862bcf
Add missing linux-headers package
Needed by opensuperclone to compile the AHCI driver
2023-02-06 18:37:38 -08:00
352d784eb5
Re-add dependencies for opensuperclone-git 2023-02-06 15:43:38 -08:00
a9b57ad3ad
Merge remote-tracking branch 'upstream/dev' into dev 2023-02-04 17:36:34 -08:00
870678c04b
Update EmsisoftCmd settings 2023-02-04 14:52:42 -08:00
ab2a7fd126
Include Disk Utilization in the quick diagnostic 2023-01-10 13:55:40 -08:00
c729a20ce5
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-23 21:03:13 -08:00
ee5f8ff8e1
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-23 20:50:54 -08:00
58925093e3
Adjust Bitlocker local file name and formatting 2022-12-23 20:43:29 -08:00
893f2bc31a
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-23 19:10:37 -08:00
e963b2afa6
Add option to post Bitlocker info to osTicket 2022-12-23 18:05:44 -08:00
813157fd17
Remove HDClone sections 2022-12-17 23:25:26 -08:00
aabe4a1944
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-17 23:21:38 -08:00
4756064405
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-17 21:49:10 -08:00
5048f679ee
Remove old teststation sections 2022-12-15 22:38:11 -08:00
51a3731124
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-15 21:33:21 -08:00
847b7587a7
Remove comment 2022-12-15 17:24:35 -08:00
f753479708
Add timeouts to requests calls 2022-12-15 17:06:44 -08:00
70bb666fa1
Refactor Disk Utilization reporting
Results are now shown on screen in addition to the osTicket post.
2022-12-14 02:42:23 -08:00
2aa95fd8db
Fix CPU checkbox not updating 2022-12-11 21:48:58 -08:00
7144ab0106
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-11 21:48:23 -08:00
e60c52e6ba
Add more missing dependencies 2022-12-11 20:59:36 -08:00
ba158c9e16
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-11 20:59:19 -08:00
d5c0869949
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-11 19:08:48 -08:00
b3a8bbcc36
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-03 22:04:49 -08:00
5f5a68095c
Replace compton (again) 2022-12-03 22:03:21 -08:00
95c16106fc
Update WinPE image as requested 2022-12-03 21:55:30 -08:00
5b69eec2f2
Add Super Purdy Build art 2022-12-03 21:48:50 -08:00
9686dca0f6
Avoid crash if osTicket integration is disabled 2022-12-03 21:43:40 -08:00
60168e14ae
Fix badblocks reports
- Better filter the raw results, stripping the backspaces from the text.
- Fix color used when printing to the screen
2022-12-03 21:35:42 -08:00
2431e2e00e
Fix System Info section in HW diags
Avoid running every time, use the menu selection in stead.
2022-12-03 19:00:31 -08:00
aa3dc51740
Merge remote-tracking branch 'upstream/dev' into dev 2022-12-03 17:27:31 -08:00
153bc8d8d6
Merge remote-tracking branch 'upstream/dev' into dev 2022-11-12 23:23:28 -08:00
84064c381a
Merge remote-tracking branch 'upstream/dev' into dev 2022-11-12 22:21:09 -08:00
43d951438a
Update Linux wallpaper (again) 2022-10-30 22:38:46 -07:00
bcc0ad6bdc
Update Linux wallpaper 2022-10-30 21:26:27 -07:00
b607905dab
Update .zlogin 2022-10-30 21:26:18 -07:00
c48db1b088
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-30 21:25:55 -07:00
6d7c489b37
Update art for the Purdy Build 2022-10-29 12:39:27 -07:00
c690e59d27
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-29 12:10:24 -07:00
d846c544d0
Add system info post to hw-diags 2022-10-29 12:03:50 -07:00
78ef6b3e76
Don't open Defender settings if it's disabled. 2022-10-26 18:35:51 -07:00
0d93da4551
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-24 12:55:23 -07:00
5c6651f63d
Fix Auto Repairs presets 2022-10-23 17:13:19 -07:00
46f30907f8
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-23 17:12:10 -07:00
873be60ec6
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-23 13:33:42 -07:00
a76525307a
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-22 20:37:16 -07:00
916250bffa
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-22 20:22:37 -07:00
7ba17e43f7
Add dev build Wallpapers 2022-10-22 20:11:34 -07:00
30eee99f5a
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-22 19:59:29 -07:00
7c72e35644
Fix build_win.py download order 2022-10-22 19:59:04 -07:00
084dbbaada
Add Light Malware/Virus Cleanup preset 2022-10-22 19:12:23 -07:00
a91f47b226
Reorder Auto Repairs entries 2022-10-22 19:12:02 -07:00
0c27ba1e87
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-22 19:00:16 -07:00
f993050120
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-22 18:28:15 -07:00
54b15da2e6
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-19 23:39:32 -07:00
02cde33f5d
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-09 00:53:02 -07:00
26022f6011
Fix I/O benchmark graph uploads
Addresses issue #22
2022-10-08 22:07:27 -07:00
d733790c1a
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-08 22:06:26 -07:00
5afb45dbb3
Add "Apply ITS Settings" to Auto Setup
Addresses issue #18
2022-10-08 20:46:24 -07:00
7512f5f2a1
Add set_lp8550_slope.py
Addresses issue #17
2022-10-08 20:28:33 -07:00
03ade0ea9b
Remove unused wallpapers
Related to issue #29
2022-10-08 20:06:38 -07:00
ed44e675af
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-08 20:04:44 -07:00
c2bb41351b
Add journal alias
Addresses issue #24
2022-10-08 19:57:14 -07:00
a3a5851745
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-08 19:39:15 -07:00
f1e29cd0c8
Only call gpt under macOS 2022-10-08 19:30:05 -07:00
f0d0ea8164
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-08 19:29:42 -07:00
5670591035
Add Data Transfer preset to Auto Repairs 2022-10-01 19:56:42 -07:00
b91030fde4
Add CoreTemp and stress tests launcher 2022-10-01 19:56:35 -07:00
3dbb5431dc
Merge remote-tracking branch 'upstream/dev' into dev 2022-10-01 19:20:19 -07:00
579ae52a68
Remove initial reboot in AutoRepairs 2022-09-28 17:16:16 -07:00
6da14beabe
Fix malware scans 2022-09-28 17:13:21 -07:00
7c8e0f7c5a
Move WinSCP to Tools folder 2022-09-28 09:58:40 -07:00
9b53a6d79d
Include MariaDB in Windows kit 2022-09-28 09:57:03 -07:00
5cbe23166a
Avoid crash under Windows 2022-09-28 09:56:09 -07:00
838df9d2cc
Merge remote-tracking branch 'upstream/dev' into dev 2022-09-28 09:33:12 -07:00
fa35021ab3
Merge remote-tracking branch 'upstream/dev' into dev 2022-09-28 09:28:13 -07:00
39864daf0a
Merge remote-tracking branch 'upstream/dev' into dev 2022-09-28 09:15:33 -07:00
4dffb1046b
Fix osTicket checkbox bug 2022-09-24 20:02:37 -07:00
a10ec04a3b
Merge remote-tracking branch 'upstream/dev' into dev 2022-09-24 19:59:33 -07:00
a97bcf8caa
Switch to python-mariadb-connector
The most recent version of python-mysql-connector wasn't able to connect
to the server due to the utf8 encoding
2022-09-24 18:24:14 -07:00
7834de599a
(Re)add udevil to AUR build list 2022-09-23 19:30:56 -07:00
a3d14012bb
Merge remote-tracking branch 'upstream/dev' into dev 2022-09-23 18:27:01 -07:00
3cdde46eda
Check if MS Defender is enabled before prompting 2022-09-18 17:18:45 -07:00
bd7bfdb6bb
Merge remote-tracking branch 'upstream/dev' into dev 2022-09-18 15:42:47 -07:00
da1222f9cb
Update Linux package lists 2022-08-03 17:58:17 -07:00
3bbbccc1ca
Merge branch 'dev' of ssh://1201.ddns.net:2222/1201/WizardKit into dev 2022-07-11 12:24:41 -07:00
c6ff30722d
Include more lines in the badblocks reports
Partially addresses issue #27
2022-07-10 16:45:08 -07:00
9bcb0bdb32
Upload benchmark graphs to ticket range subfolders
Partially addresses issue #22
2022-07-10 16:28:03 -07:00
6320533f86
Fix syntax error 2022-07-10 16:22:45 -07:00
54f6b8f9ae
Allow minor errors on destination disks
Addresses issue #28
2022-07-10 16:10:46 -07:00
7162c8e660
Merge remote-tracking branch 'upstream/dev' into dev 2022-07-10 16:10:29 -07:00
6e90f79be5
Merge remote-tracking branch 'upstream/dev' into dev 2022-07-10 15:26:46 -07:00
bb529f9313
Merge remote-tracking branch 'upstream/dev' into dev 2022-06-24 10:38:11 -07:00
fc31c33354
Merge remote-tracking branch 'upstream/dev' into dev 2022-05-24 16:25:24 -07:00
49417e4148
Merge remote-tracking branch 'upstream/dev' into dev 2022-05-24 12:45:08 -07:00
0dfe28559f
Add missing WK Clone shortcut hint 2022-05-24 12:22:51 -07:00
4b269cc120
Skip disk utilization checks for small devices 2022-05-21 20:20:57 -07:00
8c67830345
Add disk volume utilization test
Addresses issue #19
2022-05-21 19:43:47 -07:00
7ffbcc83fa
Move HW diagnostic osTicket functions to new file 2022-05-21 18:16:40 -07:00
d039fb962d
Merge remote-tracking branch 'upstream/dev' into dev 2022-05-21 17:39:32 -07:00
cc4b485a24
Merge remote-tracking branch 'upstream/dev' into dev 2022-05-21 15:09:42 -07:00
9159f0e1ab
Merge remote-tracking branch 'upstream/dev' into dev 2022-05-19 15:14:18 -07:00
5bb940e9d6
BREAKING Merge remote-tracking branch 'upstream/dev' into dev 2022-05-19 15:08:46 -07:00
326c38595e
Merge remote-tracking branch 'upstream/dev' into dev 2022-05-16 15:12:14 -07:00
4ffd06235e
Merge remote-tracking branch 'upstream/dev' into dev 2022-05-14 18:02:05 -07:00
7bcd650d25
Merge remote-tracking branch 'upstream/dev' into dev
Includes a lot of updates to support the new split wk/hw setup.
2022-05-01 19:29:53 -07:00
7325e00097
Merge branch 'new-ddrescue-arguments' into dev 2022-03-31 17:45:29 -06:00
febaa840fa
Merge remote-tracking branch 'upstream/dev' into dev 2022-03-31 17:45:17 -06:00
3b3f737ed5
Merge remote-tracking branch 'upstream/new-ddrescue-arguments' into new-ddrescue-arguments 2022-03-31 17:43:46 -06:00
7d02d0733b
Tell user to disable or enable realtime scanning
Addresses issue #20
2022-03-31 17:12:18 -06:00
31e8fd5c4f
Merge remote-tracking branch 'upstream/dev' into dev 2022-03-10 15:37:57 -07:00
981abbb8c2
Merge remote-tracking branch 'upstream/new-ddrescue-arguments' into new-ddrescue-arguments 2022-03-08 15:21:34 -07:00
a22181712b
Update macWK wallpaper 2022-02-24 22:37:39 -07:00
00b9daf41b
Update Syslinux.jpg 2022-02-24 18:21:57 -07:00
b398ba32ac
Replace remaining references to Alacritty with st 2022-02-24 17:41:13 -07:00
a70ee2e830
Update rEFInd.conf 2022-02-24 17:39:15 -07:00
480410e2e7
Update rEFInd.png 2022-02-24 17:05:02 -07:00
a1102cc97d
Merge remote-tracking branch 'upstream/dev' into dev 2022-02-24 17:03:36 -07:00
96451f640c
Adjust rEFInd config 2022-02-24 15:00:26 -07:00
8c4415d321
Merge remote-tracking branch 'upstream/dev' into dev 2022-02-23 13:05:36 -07:00
2ce057e394
Adjust ddrescue-tui main menu 2022-02-22 16:49:21 -07:00
5ec1bcf89c
Switch to Emily Build art 2022-02-22 15:04:57 -07:00
bb9c710637
Merge remote-tracking branch 'upstream/dev' into dev 2022-02-22 13:23:11 -07:00
16d47a12a6
Simplify the WKClone source/dest selection
Only show confirmation #2 if using advanced partition selection.
2022-02-22 13:14:25 -07:00
80f9bb6d75
Run AV scans using HIGH priority
Addresses issue #13
2022-02-21 17:45:12 -07:00
f3522e42ef
Add option to launch processes with HIGH priority 2022-02-21 17:44:23 -07:00
9672ad0175
Add steps to disable/enable Windows Defender scans
Addresses issue #8
2022-02-21 15:52:16 -07:00
0cadf54b4d
Open webcam tests at the end of Auto Setup
Addresses issue #9
2022-02-21 01:03:39 -07:00
487bfba2e5
Skip updating disk checkboxes if no disks present
Addresses issue #6
2022-02-21 00:46:01 -07:00
0e4ee42f28
Add "Fresh start" menu entry to ddrescue-tui
Addresses issue #15
2022-02-20 20:22:25 -07:00
abd1855bc9
Fix whitespace 2022-02-20 18:14:58 -07:00
06c7d2ca20
Merge remote-tracking branch 'upstream/dev' into dev
Addresses issue #12
2022-02-20 18:13:49 -07:00
746be1d2d7
Update ticket lastresponse in post_response()
Addesses issue #14
2022-02-20 17:10:47 -07:00
147c35f0c6
Add support for tech notes in ddrescue-tui
Addresses issue #11
2022-02-19 18:47:12 -07:00
b3f4a31ed2
Move detect drives logic to its own function 2022-02-19 18:42:41 -07:00
4550b13565
Add osTicket pane to ddrescue-tui
Addresses issue #10
2022-02-18 17:21:56 -07:00
a8fada86fd
Merge remote-tracking branch 'upstream/dev' into dev 2021-12-14 21:07:00 -07:00
7dc64fb73b
Merge remote-tracking branch 'upstream/dev' into dev 2021-12-14 15:34:27 -07:00
62d8dff7c6
Merge remote-tracking branch 'upstream/dev' into dev 2021-12-13 19:31:46 -07:00
dc6111b584
Update tool versions 2021-12-13 17:58:10 -07:00
31be77be3e
Merge remote-tracking branch 'upstream/dev' into dev 2021-12-13 17:56:51 -07:00
a64fe1c9b0
Update to Wolf Brothers III theme 2021-12-11 21:28:03 -07:00
4782d2d67d
Merge remote-tracking branch 'upstream/dev' into dev 2021-12-09 00:02:49 -07:00
2b3d7bf5ce
Drop 1201 Root CA usage in favor of new setup 2021-12-08 22:36:23 -07:00
8bbb49d0b6
Update SSH keys 2021-12-08 22:35:31 -07:00
98fdb48a27
Deselect Autologon by default
Addresses issue #4
2021-12-08 21:43:32 -07:00
011d96089b
Merge remote-tracking branch 'upstream/dev' into dev 2021-12-08 21:29:10 -07:00
40d0b302f1
Merge remote-tracking branch 'upstream/dev' into dev 2021-11-10 23:01:11 -07:00
6750b434b7
Fix typo 2021-11-10 22:30:59 -07:00
e8a05e8088
Merge remote-tracking branch 'upstream/dev' into dev 2021-11-07 20:11:03 -07:00
5ce0da5d8a
Fix missing background in ConEmu 2021-11-07 20:05:12 -07:00
941af80018
Merge remote-tracking branch 'upstream/dev' into dev 2021-11-07 17:57:35 -07:00
f9c60e707d
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-28 23:53:38 -06:00
f9bdbcdea8
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-28 04:19:33 -06:00
05d8762c6c
Use MS Office filetypes by default 2021-10-27 22:41:07 -06:00
ac9a6bfc73
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-27 20:41:49 -06:00
ba2ba5fd98
Use new method to disable Fast Startup 2021-10-27 20:19:11 -06:00
2d131d0613
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-27 20:02:13 -06:00
f072fe07d0
Change custom power plan name 2021-10-27 18:29:17 -06:00
94aee9e1d3
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-27 18:27:23 -06:00
38a40c5551
Update Emsisoft sections 2021-10-21 02:46:29 -06:00
da74063d8a
Fix bug in fix_file_associations() 2021-10-20 23:42:25 -06:00
07155c9f0e
Update Emsisoft sections 2021-10-20 23:41:55 -06:00
1138347b29
Add missing download in build_win 2021-10-20 23:40:31 -06:00
32f46329ba
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-20 23:10:21 -06:00
3a62e8dcaa
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-20 22:42:03 -06:00
af76831ca1
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-20 22:05:00 -06:00
532a45533e
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-20 20:56:17 -06:00
6a6a61cb78
Add ShutUp10 sections to wk.kit.build_win 2021-10-15 18:47:27 -06:00
17a644f05d
Drop more cbin usage 2021-10-15 18:47:08 -06:00
dc9565185c
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-15 02:30:59 -06:00
c608ed3af3
Fix bugs 2021-10-15 00:26:36 -06:00
fb4ddb5cbe
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-15 00:26:13 -06:00
8d825b561c
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-14 20:34:12 -06:00
d15083553e
Add missing launchers 2021-10-14 20:24:55 -06:00
ef2919899b
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-14 20:22:06 -06:00
3f48cc4e46
Prompt for AV scan if Fab was recently run
Addresses issue #116
2021-10-14 19:53:29 -06:00
3f2b7e24e6
Fix bad function call 2021-10-14 19:52:06 -06:00
a0fe13c7c2
Add Windows Repair AIO 2021-10-14 19:15:17 -06:00
9f59885dbc
Add WinSCP to Windows Kit
Addresses issue #121
2021-10-14 19:11:10 -06:00
1b351859b8
Add Prime95 to the Windows Kit
Resolved issue #133
2021-10-14 18:36:40 -06:00
ba1ff95b21
Fix issue #122 2021-10-14 18:29:40 -06:00
277fc4e02d
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-14 17:57:27 -06:00
551c28f242
Remove old code 2021-10-14 17:34:23 -06:00
9cd39c5691
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-14 17:23:10 -06:00
fda31a262b
Add Snappy Driver Installer Origin sections 2021-10-02 18:38:46 -06:00
87bc6220f5
Merge remote-tracking branch 'upstream/dev' into dev 2021-10-02 18:12:32 -06:00
45ec8e5ec9
Add ShutUp 10 sections 2021-10-02 18:11:53 -06:00
dcd41b5084
Move setup functions to the right section 2021-10-02 17:48:53 -06:00
1168e8b0dd
Add Hiberboot and hibernation sections 2021-10-02 17:44:59 -06:00
6db1be4046
Add ESET to selection questions 2021-10-02 17:25:02 -06:00
68418588b7
Merge remote-tracking branch 'upstream/dev' into dev 2021-09-30 18:56:25 -06:00
5e5c54293b
Add ESET NOD32 AV sections 2021-09-30 18:39:29 -06:00
fed639b674
Remove unused or outdated scripts 2021-09-30 17:51:17 -06:00
af6119feb5
Fix more pylint warnings 2021-09-30 17:48:10 -06:00
0ca6d17485
Merge remote-tracking branch 'upstream/dev' into dev 2021-09-30 17:45:54 -06:00
c747b66455
Merge remote-tracking branch 'upstream/dev' into dev 2021-09-30 17:42:31 -06:00
Admin
8767a0024a Update 'scripts/wk/cfg/ufd.py' 2021-08-25 17:24:00 -07:00
Admin
a1872e6cf7 Update 'setup/linux/profile_base/EFI/boot/refind.conf' 2021-08-25 17:21:20 -07:00
Admin
14e727ee6f Upload files to 'setup/linux/profile_base/EFI/boot/icons' 2021-08-25 17:20:14 -07:00
0808c8affc
Merge remote-tracking branch 'upstream/dev' into dev 2021-08-25 16:01:11 -06:00
3ebebbe5b9
Apply even more fixes for Alacritty 2021-07-24 19:30:54 -06:00
a46557020b
Merge remote-tracking branch 'upstream/dev' into dev 2021-07-24 19:29:47 -06:00
bd9ba3941e
Merge remote-tracking branch 'upstream/dev' into dev 2021-07-24 18:29:57 -06:00
4e456f41da
Fix rEFInd wallpaper naming 2021-07-24 18:25:42 -06:00
84f716b5cd
Merge remote-tracking branch 'upstream/dev' into dev 2021-07-24 18:10:03 -06:00
3a2cd84d92
Update to Wolf Brothers II theme 2021-07-24 16:49:27 -06:00
70c09a3c7b
Add option to boot to existing OS 2021-07-24 02:57:47 -06:00
29f5dab4da
Merge remote-tracking branch 'upstream/dev' into dev 2021-07-24 02:45:30 -06:00
40d5b147b5
Skip scanning archives with Emsisoft 2021-06-30 18:12:38 -06:00
29dc4694b4
Merge remote-tracking branch 'upstream/dev' into dev 2021-06-23 23:36:03 -06:00
f18c3843ca
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-17 14:58:41 -06:00
2840795b78
Set power plan to high performance in Auto Repairs 2021-05-14 15:41:19 -06:00
a8cf29c5fe
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-14 15:39:36 -06:00
5a320658c2
Fix Emsisoft cmd
Not sure why it worked when testing locally on C: but it lost it's mind
when running from E:
2021-05-13 21:41:16 -06:00
93fbd29a1c
Update UFD sections (again) 2021-05-13 21:41:01 -06:00
aff124dd8c
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-13 21:37:56 -06:00
81ab4a7192
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-08 02:15:23 -06:00
326ee3953d
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-07 23:57:23 -06:00
db25a632fe
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-07 18:26:17 -06:00
9c8c7099e5
Add MBAM sections 2021-05-07 04:58:40 -06:00
b80e73a5ad
Use new set_quarantine_path() 2021-05-07 02:44:57 -06:00
0baea441ae
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-07 02:43:18 -06:00
228114f82c
Add Emsisoft section 2021-05-06 03:13:44 -06:00
297d03b0f2
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-05 23:58:18 -06:00
23f519102d
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-05 23:43:25 -06:00
6cece2c832
Add file associations sections 2021-05-02 02:18:23 -06:00
b57f50d4b5
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-02 02:17:28 -06:00
eaa367a5c9
Fix imports under Windows 2021-05-02 02:14:28 -06:00
2a90a381a4
Merge remote-tracking branch 'upstream/dev' into dev 2021-05-02 01:17:13 -06:00
da9563f870
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-15 01:37:18 -06:00
c90bc0ef37
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-11 15:32:16 -06:00
15edb2b5c9
Remove reference to unused image 2021-04-11 15:29:46 -06:00
c6ca5228ac
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-11 15:28:27 -06:00
2774e54732
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-10 17:47:25 -06:00
585a24bbbe
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-09 18:52:46 -06:00
bed7e79758
Add questionable argument to hw-diags
I, the author of this script, strongly recommend against using this!

References issue #139
2021-04-09 04:15:20 -06:00
4b956cb488
Disable benchmarks only for smaller USB drives
Addresses issue #128
2021-04-09 03:51:13 -06:00
a42d5e06f4
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-09 03:08:19 -06:00
d0b8b3ad57
Add even more pylint cleanup fixes 2021-04-09 00:18:18 -06:00
af09772d67
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-09 00:16:41 -06:00
8689a68c2f
Skip asking for a ticket ID twice
For this to happen the tech has to disable osTicket integration first
so in that case just set ticket to the date.  No need asking again.

Addresses issue #132 (I think, couldn't reproduce)
2021-04-08 23:58:44 -06:00
388c6302cb
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-08 23:41:01 -06:00
249e868c3d
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-08 23:22:56 -06:00
a5766a8a1e
Avoid more possibles crashes when uploading graphs 2021-04-06 17:27:44 -06:00
ccbc257cc0
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-06 17:08:46 -06:00
86f0f14c34
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-06 17:06:30 -06:00
1fcbcb4287
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-05 19:57:47 -06:00
b2f9d990f2
Remove DS_Store files 2021-04-04 03:44:05 -06:00
bec6c727e2
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-04 03:38:14 -06:00
ad06ca0cb1
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-02 19:30:48 -06:00
1107f9224c
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-02 18:44:27 -06:00
a84a6a7f10
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-02 18:38:06 -06:00
43ee4e5ae0
Darken wallpapers for macOS 2021-04-02 18:36:12 -06:00
2669bd729e
Update to Wolf Brothers theme 2021-04-02 02:21:28 -06:00
95b6bddb99
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-02 02:10:35 -06:00
641695a2be
Avoid crash if benchmark image fails to generate 2021-04-01 23:22:04 -06:00
f0e15ceb81
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-01 23:13:14 -06:00
2da38458db
Merge remote-tracking branch 'upstream/dev' into dev 2021-04-01 02:04:11 -06:00
586e3fc61c
Merge remote-tracking branch 'upstream/dev' into dev 2021-03-26 01:24:35 -06:00
4678b5f7c8
Rename macos setup folder 2021-03-26 01:15:57 -06:00
1e09ddc9ff
Merge remote-tracking branch 'upstream/dev' into dev 2021-03-25 21:28:50 -06:00
467a7e7925
Merge remote-tracking branch 'upstream/dev' into dev 2021-03-25 15:20:55 -06:00
bad27e20ad
Merge remote-tracking branch 'upstream/dev' into dev 2021-03-25 15:01:40 -06:00
a3ab558bb4
Resize WKClone windows at launch 2021-03-25 00:33:29 -06:00
bd665b7065
Update build_linux 2021-03-25 00:09:40 -06:00
f93334e2d3
Merge remote-tracking branch 'upstream/dev' into dev 2021-03-25 00:09:29 -06:00
944e4dcea5
Merge remote-tracking branch 'upstream/dev' into dev 2021-03-24 23:49:52 -06:00
8ab3c765c0
Update dinraal SSH key 2021-03-24 23:46:25 -06:00
60e5d86f8e
Merge remote-tracking branch 'upstream/dev' into dev 2021-03-24 22:22:54 -06:00
2Shirt
13f802c195 Add timezones if needed 2021-03-19 16:23:36 -06:00
2Shirt
7147ef1753 Fix get_serial() 2021-03-19 15:23:49 -06:00
2Shirt
080383d9a9 Fix bad call to mount_disk() 2021-03-19 03:37:40 -06:00
2Shirt
30f661183c Update bash/zsh/iTerm environments 2021-03-19 03:36:55 -06:00
2Shirt
70aa8e40ac Skip copying .git* items to macOS images 2021-03-18 22:49:15 -06:00
2Shirt
207c52663b Allow mounting of protected macOS partitions
Renamed mount_volumes() to mount_disk() to better match diskutil naming.
Dropped read_write from mount_disk() since it isn't used
2021-03-18 22:23:07 -06:00
2Shirt
7c1a9f4bdc Fix osTicket volume report 2021-03-18 21:52:29 -06:00
2Shirt
2b98eeabca Include GPT info when saving hw-diaqs debug data 2021-03-18 21:41:59 -06:00
2Shirt
ef426c95b5 Fix get_core_storage_volumes() 2021-03-18 21:29:58 -06:00
2Shirt
e76ee88b01 Fix Utilities plist under El Capitan 2021-03-18 20:42:34 -06:00
2Shirt
908ffdc999 Add mount_volumes() to wk.os.mac
Supports both CoreStorage and APFS containers
2021-03-18 03:23:09 -06:00
2Shirt
a36589b66f Add support for High Sierra 2021-03-17 01:48:22 -06:00
2Shirt
5faf3dbbad Update update-base-image 2021-03-17 01:34:54 -06:00
2Shirt
bc3f6946f7 Add support for macOS High Sierra Base Images 2021-03-17 01:23:12 -06:00
2Shirt
fa5eaf33f9 Update update-base-image 2021-03-13 04:21:37 -07:00
2Shirt
be2407a250 Include 1201 CA cert in live-macOS image 2021-03-13 03:30:08 -07:00
2Shirt
f4ce98ceba Update iTerm2 settings 2021-03-13 03:25:10 -07:00
2Shirt
2d9032f5b6 Keep system awake in live-macOS 2021-03-13 03:21:38 -07:00
2Shirt
4dc5c51beb Include Mac serial number in OST Post 2021-03-13 03:20:51 -07:00
2Shirt
72259303b9 Mount RAM Disk in live-macOS 2021-03-13 03:19:39 -07:00
2Shirt
314675c32e Unknown 2021-03-13 03:15:30 -07:00
2Shirt
ccaf2a67b2 Update upload-logs to work under live-macOS 2021-03-13 03:12:36 -07:00
2Shirt
7a9d62cdd1 Add live-macOS updates from 2020-01-30 2021-03-13 03:08:19 -07:00
1b7c248102
Merge remote-tracking branch 'upstream/dev' into dev 2020-02-03 18:16:12 -07:00
c1970b8c23
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-30 14:09:13 -07:00
e8522bf2bb
Added pause if fan speed can't be set under macOS
* This can be removed after a bit of real-world testing
2020-01-30 14:08:05 -07:00
1fe4fd9849
Added 1201 Root CA to fix upload sections 2020-01-30 14:06:16 -07:00
869293ced9
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-28 18:30:35 -07:00
8a4c2c059c
Added MariaDB connection timout
* Prevents waiting 1-2 minutes for it to fail if the server can't be reached
* Connection attempt is made once per _connect() call
2020-01-24 17:53:01 -07:00
cf75348c2c
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-24 12:29:01 -07:00
ac0efb90e5
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-23 18:58:50 -07:00
b9b2422c69
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-23 14:14:01 -07:00
29a8731fb5
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-22 23:19:21 -07:00
78a013f28f
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-22 21:00:09 -07:00
ec88d6f747
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-22 20:55:43 -07:00
f7c6d5d3c3
Only include graph links in osTicket posts 2020-01-22 20:10:17 -07:00
fd8f46be13
Don't export/upload graphs for skipped tests
* e.g. USB device which USB benchmarks disabled
2020-01-22 19:51:01 -07:00
701d647a91
Added I/O Benchmark PNG graph sections 2020-01-22 19:19:54 -07:00
8643ec2c7c
Fixed setting CPU max temp in osTicket 2020-01-22 19:19:00 -07:00
ee58fc1fb9
Updated Test-Station wallpapers 2020-01-22 17:35:18 -07:00
5f9aec8233
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-22 15:38:20 -07:00
0348d708d9
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-22 11:29:18 -07:00
e09216012f
List failed tests with overall result in osTicket 2020-01-20 19:08:10 -07:00
daffb606ee
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-19 16:00:29 -07:00
df29f8af6b
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-19 14:19:30 -07:00
5189326431
Don't replace existing repo in build functions
* Addresses issue #149
2020-01-19 11:54:35 -07:00
35d512262d
Updated image paths 2020-01-19 11:49:08 -07:00
53b0d9275b
Expanded test-station names 2020-01-17 16:34:44 -07:00
5fbd33e845
Fixed HDD checkbox logic 2020-01-17 16:14:29 -07:00
fa96f6ea13
Fixed known test-station names 2020-01-17 16:14:20 -07:00
adce6db578
Updated startup config 2020-01-16 20:42:55 -07:00
3265b19f3d
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-16 20:38:39 -07:00
d3597f339e
Added volume report to hw diags 2020-01-16 20:29:07 -07:00
efac71eb63
Updated hw-diags and ddrescue-tui
* Removed relative paths
2020-01-16 19:40:57 -07:00
65284860fb
Adjusted HW Diag main menu 2020-01-13 18:40:48 -07:00
5c02d74dca
Updated hw-diags and ddrescue-tui launchers 2020-01-13 18:25:43 -07:00
b1bf352f11
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-13 18:25:13 -07:00
12121c7078
Update ESET live SysRescue boot entry to use UUID 2020-01-13 18:15:51 -07:00
749580d041
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-13 17:53:42 -07:00
47b4ab6636
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-13 17:35:26 -07:00
b9d0527c52
Added osTicket checkbox sections 2020-01-11 21:23:49 -07:00
e9c0855f65
Convert CPU max temp to int 2020-01-11 20:54:35 -07:00
c1f2f0b6d8
Updated wk.cfg.main 2020-01-11 20:52:00 -07:00
426d77147f
Disable ost if connection fails post ticket select 2020-01-11 20:46:45 -07:00
e301bff2c2
Avoid replacing higher temps in osTicket 2020-01-11 20:43:27 -07:00
9c12dacfb2
Post CPU/Disk results to osTicket 2020-01-11 20:31:39 -07:00
96b755be49
Added osTicket report sections 2020-01-11 19:54:07 -07:00
fef8323282
Pass Disk Attribute test for devices lacking SMART 2020-01-11 19:53:34 -07:00
a573a7e1c3
Reset top_text before returning to main menu 2020-01-11 16:59:42 -07:00
28c1d61d20
osTicket integration complete for ddrescue TUI 2020-01-11 16:46:06 -07:00
177a7fbec2
Added 1201 server definitions 2020-01-11 16:45:54 -07:00
2f2bfacbb7
Started integrating osTicket functions in ddrescue 2020-01-10 19:32:25 -07:00
ceee0495eb
Started integrating osTicket functions in HW Diags 2020-01-10 18:50:21 -07:00
7e69eff7a8
Fixed wk.os.linux.mount_volumes() 2020-01-10 18:07:02 -07:00
a81e6f80e6
Adjusted response formatting and added add_note()
* Test-Station name *should* be included in all posts
* Ticket ID and name included in all posts
* Optional osTicket note included in all posts
2020-01-10 17:52:56 -07:00
e438d3aec7
Dropped _convert_report()
* This should be handled in wk.hw.diags and wk.hw.ddrescue
2020-01-10 17:10:13 -07:00
b4e07a0d88
Added post_response() 2020-01-10 17:04:28 -07:00
dcd1525c4f
Added safety checks 2020-01-10 17:04:13 -07:00
e9e19053f4
Finished osTicket checkbox functions 2020-01-10 16:29:20 -07:00
df2a7c03c1
Added initial osTicket files 2020-01-08 22:05:23 -07:00
752944f741
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-08 20:52:00 -07:00
8932242a86
Merge remote-tracking branch 'upstream/dev' into dev 2020-01-08 17:07:33 -07:00
0f05eeba29
Merge branch 'project-overhaul' into dev 2020-01-08 15:55:03 -07:00
3c459134da
Renamed setup/pe/_include to setup/pe/bin 2020-01-08 15:54:26 -07:00
77a023d777
Merge branch 'project-overhaul' into dev 2020-01-08 15:42:35 -07:00
ac2e5a4fcf
New project orgnization
* Match upstream layout for the benefits listed there
2020-01-08 00:28:56 -07:00
9150c8b784
Removed LICENSE.txt 2020-01-08 00:03:00 -07:00
d3293526f4
WizardKit - v1.8.4 - Stanley Build
Linux
* HW-Diagnostics
  * Reworked osTicket checkbox logic
    * There is now a prompt on the results page to update the checkboxes
    * If you choose yes it will update the HDD & CPU PASS/FAIL & CPU max temp
  * Prime95
    * If CPU temps >= 90°C then the test is marked as FAILED
    * If CPU temps >= 99°C then the test is halted
    * If no sensors are found and the checkboxes are updated, it will use 0°C
  * badblocks & I/O Benchmark tests are run in most scenarios now
    * SMART Self-Test failure will not block these tests
    * SMART C9 / 201 will not block these tests (was seen on several LiteOn SSDs)
    * Only critical NVMe/SMART attributes will prevent these tests from running
  * Added workaround for the Crucial MX500 series of SSDs
    * If this is used it will be shown in the results page and osTicket post
  * Failing NVMe/SMART attributes are individually marked for clarity
  * Fixed 4K partition alignment check (most boot partitions were being falsely flagged)
  * Removed several prompts from the HW-Diagnostic startup
  * Removed prompt to upload for review
* ddrescue-TUI (a.k.a WKClone & WKImage)
  * Journal output is limited to kernel events
    * Avoids a flood of "Updating conky" and "sudo" messages
* Added upload-logs script
  * If you see something weird please run this command to upload to Nextcloud
  * This script asks why you're uploading the logs
* Added CTRL+ALT shortuts to match the Super shortcuts
  * e.g. CTRL+ALT+d to open HW Diagnostics
* Much better input handling - should avoid EOFErrors we've been seeing
* Test-Station names should be included in osTicket posts
* Misc bugfixes

Windows
* Added Windows 10 v1909 support
* d7II
  * Added "Starting d7II..." message to launch script
  * Windows Updates are enabled during the default selections
  * SoftwareDistribution folder is now renamed if it can't be deleted
    * Avoids unnecessary crash/reboot
* System Setup
  * Renamed modes
  * Added Verify option
    * This skips all installation steps and optionally skips opening apps
  * Classic Start is now installed for all non-HW non-Verify modes
  * Google Chrome notifications are disabled by directly editing the Preferences file
    * This avoids having Chrome tell you the browser is "Managed by your organization"
  * Added a permission fix for Windows\Temp
  * Browser backups are no longer compressed
    * This should avoid the major slowdowns seen for Chrome profiles
  * Reduced the amount of Ninite windows opened in some cases
  * Updated ShutUp10 config to avoid breaking Windows Search
  * Added prompt to set the default browser/apps
* Updated tools
* Misc bugfixes
2019-11-30 20:17:13 -07:00
bb0a74b98c
Open ESET or KVRT during system_setup.py mode 2 2019-11-26 13:48:24 -07:00
6f44a37cd0
Suppress SSH warnings 2019-11-19 18:56:45 -07:00
9af378ed7c
Removing tcpflush call
* I'll accept a few errant EOFErrors to avoid screen tearing/glitching
2019-11-19 18:55:49 -07:00
4dcebdfbf3
Add smbclient packages 2019-11-19 16:06:59 -07:00
5c84d3f778
Stanley theme 2019-11-19 14:54:43 -07:00
c515033bfa
Update for the new Archlinux base package 2019-11-19 14:15:41 -07:00
63adbc6b3a
Added upload-logs script 2019-11-19 14:12:48 -07:00
3c5f9c1bbe
Added workaround for MX500 SSD issues 2019-11-18 21:47:23 -07:00
c3500ee324
Fail CPU test if temps reach THERMAL_FAIL
* The test is allowed to finish as long as temps < THERMAL_LIMIT
* Addresses issue #111
2019-11-18 21:21:42 -07:00
d1b37eddc1
Restrict journal output to kernel messages 2019-11-18 21:00:09 -07:00
095c00c6ee
Ensure SSH tunnel is closed atexit 2019-11-18 20:57:00 -07:00
4b7e34eb17
Only disable disk tests for critical errors 2019-11-18 20:47:13 -07:00
b1a68e20d7
Label failing disk attributes in reports 2019-11-18 20:18:22 -07:00
a71d56e473
More checkbox updates 2019-11-18 20:10:07 -07:00
58d8722ae2
Always save HW-Diags debug data 2019-11-18 20:09:38 -07:00
c75a67d34b
Fix 4K alignment check under Linux 2019-11-18 20:08:31 -07:00
364f981a58
Adjusted tmux sections 2019-11-18 19:40:16 -07:00
5d5da09c0d
Remove NVMe 'media_errors' from Critical list 2019-11-18 19:39:22 -07:00
0a4f87b0ce
More checkbox updates 2019-11-18 19:38:56 -07:00
8c4ed4ffc5
Only disable disk tests for critical failures
* Addressees issue #109 and #112
2019-11-18 19:34:53 -07:00
214e2c345d
Expanded HW-Diags - osTicket checkbox sections 2019-11-18 18:47:39 -07:00
a41271e296
Enable Windows updates during d7II 2019-11-18 17:47:33 -07:00
990618bfeb
Avoid EOFErrors 2019-11-18 17:47:32 -07:00
f2373edd8e
Address issue #96 2019-11-17 14:54:49 -07:00
8b25326b2d
Fix disabling Chrome notifications 2019-11-16 17:56:00 -07:00
4aca178f85
Bugfixes 2019-11-16 17:35:48 -07:00
d69b0051e1
Add Windows\Temp permissions fix 2019-11-16 17:11:52 -07:00
b1739b02a0
Kill Chrome before updating Preferences 2019-11-16 17:11:38 -07:00
44cc931840
Disble Chrome notifications via Preferences file
* Instead of system-wide via the registry
  * Avoids the "Managed by your organization" message
2019-11-16 16:06:27 -07:00
7e2db4c1ee
Disable compression for browser backups
* Avoids major slowdowns on some systems
2019-11-16 14:56:56 -07:00
11401513e2
Simplified ninite section 2019-11-16 14:56:42 -07:00
b9e99ac4d8
Include classic start in base group 2019-11-16 14:40:23 -07:00
7f9f551b67
Added Windows 10 v1909 to known build list 2019-11-16 14:32:45 -07:00
3fdf714e90
Updated System Setup 2019-11-16 14:21:28 -07:00
2eaf7b0230
Fix MBAM uninstall 2019-11-16 13:49:42 -07:00
21e15272e4
Set default apps/browser during system setup 2019-11-15 17:21:06 -07:00
f5bee18d19
Add Starting d7II... message 2019-11-15 16:50:11 -07:00
54d1e11eeb
Open ODD during system setup 2019-11-15 16:50:02 -07:00
c63f17192e
Renamed System Setup modes and added Verify option 2019-11-15 16:27:04 -07:00
ae475a04f2
Try renaming update folder(s) if deletion fails 2019-11-15 16:07:00 -07:00
54654a73bd
Updated sources 2019-11-15 13:14:18 -07:00
638796cc44
Updated Prime95 countdown 2019-11-15 13:14:17 -07:00
21a71d0e67
Updated ShutUp10 config
* Addresses issue #108
2019-11-05 14:35:09 -07:00
825a893440
Adjusted SSH config 2019-11-05 11:09:24 -07:00
462ae7d4b9
Expanded Windows power plan sections
* Moved power plan step much earlier in system_setup
* System setup now does the following:
  * Takes backups of all power plans
  * Restores the default power plan settings
  * Sets the Balanced plan as active
* Added reset_power_plans()
* Added set_power_plan()
2019-08-03 19:55:26 -06:00
d2561eb43e
Merge remote-tracking branch 'upstream/dev' into dev
* Addresses #107
2019-08-03 19:12:18 -06:00
2a334992ab
Merge remote-tracking branch 'upstream/dev' into dev
* Addresses #107
2019-08-03 19:09:21 -06:00
578818271f
Fixed osTicket post color for failed diags 2019-08-03 18:39:56 -06:00
b4fd86f4e2
WizardKit v1.8.3 - Esther Build
Linux
* HW-Diagnostics
  * osTicket posts now colored as appropriate (diag for PASS, diag fail for anything else)
  * RAM info now included in CPU osTicket posts
  * Drives won't be failed for just SMART 188/BC
  * Power-on-time over 3 years will marked drives as failed (if that's the only issue then the other tests will be allowed to run)
* ddrescue-tui (WKClone) now checks the destination drive's health before starting
* Improved startup scripts - Much clearer on what's happening during the startup process
* Improved tmux integration - launching WKClone / HW-Diags from inside tmux no longer crashes the script
* Misc bugifxes

Windows
* d7II
  * Improved launcher - Runs safety checks, starts ESET's AVRemover, afterwards it launches d7II (Should help catch issues earlier in the workflow)
  * System Restore enabled and restore point created early in the d7II process
  * Python check removed from d7II steps and is instead included in the d7II launcher
* Chrome notifications are now disabled during System Setup (only affects new profiles unfortunately)
* Misc bugfixes
2019-07-16 20:33:46 -06:00
60dcc15536
Added shortcut for WKClone (Super+c) 2019-07-09 19:14:36 -06:00
e526a6736f
New theme 2019-07-09 01:10:19 -06:00
3f467f6f1c
Updated main.py 2019-07-08 23:39:44 -06:00
1d2ebf254e
Bumped tool versions 2019-07-08 19:05:55 -06:00
a732c3a9ff
Post UNKNOWN CPU results in DIAG FAIL color 2019-07-08 18:20:49 -06:00
90f0fb58d9
Updated d7II config
* Added CreateRestorePoint step
* Removed Python check since it's done before launching d7II
* Addresses issues #99 & #104
2019-07-07 17:59:29 -06:00
8cb599ee60
Added CreateRestorePoint.cmd for use in d7II
* Addresses issue #104
2019-07-07 17:58:44 -06:00
f9a0a11ee8
Fix waiting for AVRemover 2019-07-07 17:39:27 -06:00
e614e08d0c
Disable Chrome notifications for new profiles
* Addresses issue #101
2019-07-07 16:40:07 -06:00
f5d806a51a
Adjusted safety checks in ddrescue-tui
* Added NVMe/SMART check for destination
* Addresses issue #102
2019-07-03 20:16:45 -06:00
8c6fcfe99c
Fail drives for old age but allow further testing
* Addresses issue #103
2019-07-03 19:32:25 -06:00
0077240255
Support new color codes in osTicket posts
* Addresses #105
2019-07-02 20:53:35 -06:00
a868d28452
Fix NVMe/SMART attribute color logic 2019-07-02 20:52:59 -06:00
d397cc22ad
Merged upstream/dev and updated startup scripts 2019-06-28 14:58:07 -06:00
772b807c3d
Added AVRemover sections 2019-06-19 21:38:30 -06:00
6e9de7f2fa
Added safety checks to d7II Launcher
* Addresses issue #99
2019-06-19 21:29:57 -06:00
112800c98b
Don't fail drives for SMART 188/BC
* Fixes issue #100
2019-06-12 17:12:12 -06:00
20d054245d
Include 4K alignment warning in osTicket post
* Addresses issue #88
2019-06-12 17:07:34 -06:00
cbf37d8ea1
Include RAM details in CPU osTicket posts
* Addresses issue #88
2019-06-12 16:56:17 -06:00
1aba3476da
Merge remote-tracking branch 'upstream/dev' into dev 2019-06-12 16:38:13 -06:00
8f792ac76d
Merge remote-tracking branch 'upstream/dev' into dev 2019-06-12 16:01:03 -06:00
96c806198a
Removed redundant UAC section 2019-06-11 20:46:17 -06:00
9dc21dd1d2
Merge remote-tracking branch 'upstream/dev' into dev 2019-06-11 20:45:49 -06:00
3611ff920a
Updated functions.cleanup 2019-06-11 20:30:38 -06:00
4c3be6eac6
Merge remote-tracking branch 'upstream/dev' into dev 2019-06-11 20:19:31 -06:00
519572b53a
Fixed grub path 2019-06-11 18:03:36 -06:00
644b709f6f
1.8.2 - Mushishi Build
Changes
* Disable warning for non ODF/default in LibreOffice
* Show driver pack names in SDIO

Bugfixes
* Avoid crash in HW-Diags (quick)
* Avoid crash when a system fails Prime95
* Fixes rEFInd wallpaper handling
* Prevent constant reloading of conky (flickering)
* Support names with apostrophes when posting to osTicket
2019-06-04 16:32:39 -06:00
48a3eb461d
v1.8.1 - Mushishi Build
Main Kit
* Added Win10 v1903 support
* d7II
  * Added Python check before disabling Windows Updates
    * Provides a good break point if KB2999226 needs installed
  * Removed Install SW Bundle, User Checklist, and System Checklist
    * These are all replaced by the new System Setup script below
    * Should avoid the stalls/locks seen when configuring browsers
    * Separates repair actions from setup actions
* System Setup script
  * Replaces New System Setup, Post-d7II, System Checklists, and User Checklists
  * Actions performed are based on the mode selected and answers given
  * ESET now installed from a local source
    * Can optionally install using the MSP settings (ITS/VIP)
    * Includes updated settings for current version
  * Improved LibreOffice installations
    * Installed from a local source
    * Registers all MS Office types†
    * Sets default save-as options unless a config file is already present†
    * † Depending on setup mode selected
  * Improved performance when exporting system info
    * NOTE: Event logs are no longer saved
  * New 4K alignment check
  * New Win10 1903 theme handling
    * If updating Explorer (user) settings the Light theme is disabled
      * Set to the <= 1809 default to match Classic Start theme
* Fixed Gogs issues #44, #48, #71, #73, #77-#79, #82-#87, #89, & #93-#95
* Various other bug fixes

Linux
* Auto-connects to known WiFi networks
* Better osTicket integration
  * The ticket ID and subject are shown when selecting the ticket
  * An error is shown if the ticket ID can't be found
* ddrescue-tui (AKA WKClone and WKImage)
  * Added osTicket integration
    * Prompts for ticket ID before recovery attempts
    * Prompts to post results when exiting
    * Prompts for the ticket ID again if it was skipped before
  * Improved recovery state detection
    * NOTE: percentages may be off by 0.01% due to the rounding method used
* HW-Diagnostics
  * Added option to upload results for review
  * Added RAM info to CPU posts to osTicket
  * Added warning if one or more partitions are not 4K aligned
  * Improved AMD CPU support (k8, k10, etc)
    * These are now treated as CPU temps
    * These are now included in osTicket posts
  * Improved SMART detection and reporting
  * Quick SMART results are now posted to osTicket
    * Only if selected in the menu, not for --quick
* Linux should leave the RTC set to localtime
  * NOTE: Experimental as Linux normally expects it to be set to UTC
* New build-ufd script
  * Now written in Python
  * Only Linux (Full) is required, all other sources optional
  * Boot options are enabled based on files present on the UFD
  * Can update in place without reformatting
* Test-Station detection
  * Updates the hostname and wallpaper to match the test-station
  * NOTE: This functionality is not guaranteed to work 100% of the time
* Fixed Gogs issues #42, #43, #62-#64, #68, #72-#74, #76, #80, #81, #88, #92, & #96
* Fixed GitHub issues #101-#108, & #113
* Various other bug fixes
2019-06-04 16:25:12 -06:00
ae488138e0
Missed a rEFInd wallpaper section, switched to PNG 2019-05-29 21:10:21 -06:00
61f2ab5777
Avoid replacing .conkyrc if nothing changed
* This prevents conky from reloading every 30 seconds
2019-05-29 20:46:48 -06:00
2ff8690a66
Avoid crash in HW-Diags --quick
* The LogDir wasn't being created before being used.
2019-05-29 20:45:25 -06:00
3d4fc4c3f3
Show driver pack names in SDIO 2019-05-29 20:15:44 -06:00
5784a3c6da
Disable warning when saving non ODF/default type 2019-05-29 20:08:37 -06:00
e99f16300f
Escape single quotes before posting to osTicket
* Only done for the post body for now
2019-05-29 20:01:16 -06:00
ed339866f7
Avoid a crash when a system fails Prime95 2019-05-29 15:38:38 -06:00
f70cf16040
Updated system diagnostics
* Skip more sections under d7II mode
  * They will be handled by the new system setup script instead
* Fixed some formatting
2019-05-28 01:43:57 -06:00
55bc3f250d
Fix enabling LiveGrid 2019-05-28 01:22:50 -06:00
29b54a7b85
More ESET settings 2019-05-28 00:44:31 -06:00
8c3b6865e6
Updated ESET NOD32 AV settings
* Settings options are now standard or MSP
2019-05-28 00:04:40 -06:00
4f897d5a9c
Forgot to update refind.conf 2019-05-27 23:06:26 -06:00
7aece55434
Switched back to PNG for rEFInd 2019-05-27 22:58:30 -06:00
2b2d649a9f
Update ESET grub config 2019-05-26 18:13:11 -06:00
4912b17bf3
Improved support for AMD CPU sensors
* K8, K10, and K11? should be treated the same as CoreTemp
  * These are included in osTicket posts
* Cleaned up code for pylint
* Removed unused join_columns() function
2019-05-26 17:40:47 -06:00
9c80c357d6
Added desktop theme to SETTINGS_EXPLORER_USER 2019-05-26 16:20:28 -06:00
9b64aa3939
Updated LibreOffice source (again) 2019-05-26 15:55:58 -06:00
40e1f78216
Updated windows_builds.py to include Win10v1903 2019-05-26 15:51:33 -06:00
cd8bd6c8fb
Updated ConEmu.jpg 2019-05-24 19:19:31 -06:00
da0cecbd8b
Fixed update_smartmontools() 2019-05-24 19:19:11 -06:00
ff9e37b4e5
Updated wimlib-imagex sources 2019-05-24 18:15:07 -06:00
d99f0e0179
Updated FastCopy source 2019-05-24 18:14:53 -06:00
e7470b6fc5
Updated LibreOffice source 2019-05-24 18:05:06 -06:00
bfcf0e705b
Removed setup sections from d7II
* Those actions have been moved to System Setup
* Sections removed:
  * Install SW Bundle
  * Browser Reset (not in System Setup but currently unused)
  * User Checklist
  * System Checklist
2019-05-24 17:49:10 -06:00
96c1251ae2
Fixed ISO naming for --build-all 2019-05-24 17:36:48 -06:00
43328ab3a1
Overwrite files when extracting files with 7-Zip 2019-05-24 17:07:58 -06:00
a61d8bd666
Added perl-rename as a build dependancy 2019-05-24 16:47:50 -06:00
ddbe3b0e71
Added --build-all option 2019-05-24 16:45:52 -06:00
f395f7aec1
Remove Arch folder after mounting UFD 2019-05-24 16:10:51 -06:00
ff12a7e612
Fixed added ESET SysRescue to UFD 2019-05-24 16:10:33 -06:00
9318e97400
Mount UFD sources read-only 2019-05-24 15:39:19 -06:00
16f0b1dc2a
Typo fix 2019-05-23 18:07:02 -06:00
cb0275dc9d
Save WiFi connections using the live user
* Instead of the build user
2019-05-23 18:05:30 -06:00
bd77216ab7
Save WiFi networks by SSID not PW 2019-05-23 18:04:53 -06:00
110acfc6e2
Updated Build Linux 2019-05-23 17:34:28 -06:00
3d9030f064
Fixed copying known_networks to /root/ 2019-05-23 17:34:00 -06:00
2fc503773c
Updated add-known-networks 2019-05-23 17:33:20 -06:00
17ee37d671
Updated wallpapers 2019-05-23 15:51:07 -06:00
84cdc51a77
Updated Nextcloud links 2019-05-19 22:11:26 -06:00
ee8beb194e
Added pause after posting
* Addresses issue #62
2019-05-17 16:16:09 -06:00
ac1f02c3a0
Include block_pair size in report 2019-05-17 16:15:46 -06:00
385f4a1d15
BITWISE operators =/= LOGICAL operators
* Also fixed is_writable_dir()
2019-05-17 16:05:01 -06:00
d06f505a84
Post report to osTicket
* Addresses issue #62
2019-05-17 15:07:33 -06:00
7b3fd34e63
Added generate_report()
* Addresses issue #62
2019-05-17 14:54:06 -06:00
f2adf6f5c0
Improved ddrescue map parsing
* Get data recovered instead of percentage, should be more acurate
2019-05-16 18:23:57 -06:00
73ca03da8e
Adjusted human_readable_size
* Now supports petabytes?
2019-05-16 16:29:06 -06:00
496b28c8a6
Adjusted convert_to_bytes
* Now supports bytes!
* Now supports petabytes?
2019-05-16 16:22:56 -06:00
4228c9a3a9
Get osTicket ID and name in ddrescue-tui
* Addresses issue #62
2019-05-16 15:53:10 -06:00
26fa73a40b
Added "Connecting to osTicket..." message 2019-05-16 15:52:35 -06:00
2d4a104882
Run ddrescue-tui as standard user
* Just use sudo when calling ddrescue, losetup, etc
2019-05-16 15:45:33 -06:00
54cb77f737
Mount backup shares using tech's uid/gid
* Allows read-write access without root/sudo
2019-05-16 15:35:25 -06:00
eb4e9914d4
Disabled mounting Server1201 backup share
* This is due to issues working with mounting a subdir of a share
2019-05-16 15:14:30 -06:00
a0f9d0afed
Only change dir if destination fstype is ok
* Moved magic map_allows_fstypes to settings/ddrescue.py
* Addresses issue #74
2019-05-16 15:07:57 -06:00
867df93c30
Mount backup shares before adding block-pairs
* Helps ensure saving map files to non-volatile storage
* Addresses issue #74
2019-05-16 14:30:14 -06:00
ce275d86a4
Fixed mount-backup-shares 2019-05-16 14:14:41 -06:00
6b159cc6d4
Include test-station name in osTicket posts
* Only added if the hostname is a known test-station
* Addresses issue #96
2019-05-16 13:35:15 -06:00
f879c97e53
Updated test-station wallpapers 2019-05-15 19:26:54 -06:00
eed455e3bb
Pylint cleanup for ddrescue-tui part 4 2019-05-13 20:39:38 -06:00
6a5bba5ed3
Pylint cleanup for ddrescue-tui part 3 2019-05-13 20:35:54 -06:00
1f8b795e9a
Pylint cleanup for ddrescue-tui part 2 2019-05-13 20:08:31 -06:00
d1f8307153
Moved tmux pane logic into State objects 2019-05-13 19:59:54 -06:00
0182777f56
Fixed tmux settings 2019-05-13 19:46:09 -06:00
7b7e50b524
Fixed import order 2019-05-13 19:45:57 -06:00
ab4c201b4b
Moved build_outer_panes() into State objects 2019-05-13 19:45:22 -06:00
f452216035
Adjusted CPU report 2019-05-13 19:37:41 -06:00
df33152a38
Pylint cleanup for ddrescue-tui part 1 2019-05-13 19:26:44 -06:00
fa39c85fe4
Fix mounting backup shares under Linux 2019-05-13 18:46:30 -06:00
51b6bd0fdf
Added 4K alignment check to disk reports
* Addresses issue #73
2019-05-13 18:23:47 -06:00
6fe273cf8b
Include RAM details in report
* Addresses issue #88
2019-05-13 18:07:52 -06:00
3088a2452a
Moved get_ram_details() to hw_diags 2019-05-13 17:53:43 -06:00
3c6341953d
Added get_ram_details()
* Will be used for issue #88
2019-05-13 17:51:51 -06:00
112cfb3a4b
Fixed issue #63 2019-05-13 17:23:19 -06:00
54cfa39b77
Avoid setting the wrong wallpaper if there's no IP
* Addresses issue #90
2019-05-13 17:00:25 -06:00
1269d1fa87
Use different wallpapers for test-stations
* Addresses issue #90
2019-05-13 16:51:18 -06:00
2de8b0674e
Use localtime for RTC
* Addresses issue #92
2019-05-13 16:48:07 -06:00
de38c6f2e4
Skip event logs when exporting system info
* Addresses issue #95
2019-05-12 19:26:54 -06:00
e8bc2e1005
Set Explorer settings (user) based on setup mode
* Addresses issue #94
2019-05-12 19:04:55 -06:00
971c8c66ad
Updated show_temp_files_size()
* It now adds all section subtotals and reports that
  * Instead of just the last section subtotal
2019-05-12 18:37:17 -06:00
8ad9e834ef
Moved check_os_and_abort logic to its own function 2019-05-12 18:13:42 -06:00
e869fc96b0
Ensure there's a space after all prompts 2019-05-12 18:13:21 -06:00
c10e3f4fd0
Don't show secure boot alert box until the end 2019-05-12 18:05:34 -06:00
1134477c49
Fix formatting issue when enabling Windows Updates 2019-05-12 17:33:11 -06:00
8e7083df6b
Merge branch 'unified_system_setups' into dev 2019-05-12 17:29:37 -06:00
3f9ad7842d
Removed deprecated scripts
* All replaced with system_setup.py
* Fixes issue #93
2019-05-12 17:04:52 -06:00
20cfe6a81d
Adjusted launchers
* Removed deprecated scripts
* Moved Activation to Misc
  * It's handled automatically in system_setup.py
* Addresses issue #93
2019-05-12 17:03:13 -06:00
2ffa16248f
Added missing actions from other scripts
* system_setup.py should now have all actions performed by
  * new_system_setup.py
  * post_d7.py
  * system_checklist.py
  * system_checklist_hw.py
  * user_checklist.py
2019-05-12 17:00:49 -06:00
8ea142cfdf
Reordered sytsem setup actions 2019-05-12 16:18:50 -06:00
1e0d7f7ef8
Set more action results to uppercase 2019-05-12 15:57:10 -06:00
b3f8790f01
Fixed enabling hibernation 2019-05-12 15:55:23 -06:00
a953d81b96
Fix Ninite selections 2019-05-12 15:37:59 -06:00
1b67a4293d
Avoid crash when no selections are enabled 2019-05-12 15:37:38 -06:00
c1005f6212
Fixed typos 2019-05-12 15:16:38 -06:00
96a74f956b
Skip Fast Startup/Hibernation question for SSDs
* Should fix issue #87
2019-05-12 15:07:05 -06:00
ef0b2cbb58
Added function drive_is_rotational() 2019-05-12 15:06:41 -06:00
9fc882533d
Added smartmontools 2019-05-12 14:42:44 -06:00
d2ee7e4d0e
Merge branch 'unified_system_setups' into dev
* Addresses issues #82, #83, #86, & #87
2019-05-10 20:37:09 -06:00
823de2dd9e
Added disable Fast Startup enable Hibernation
* Addresses issue #87
2019-05-10 20:33:46 -06:00
6e53e7c7d2
Create system restore point during system setup
* Addresses issues #83 & #86
2019-05-10 20:09:39 -06:00
e64b7f4eaa
Updated software bundle sections
* NOTE: This update message should be in the previous commit
  * c30e30232f
* Always update currently installed software
* Avoid calling the same installer in multiple sections
  * e.g. In both the main and extra selections
* Simplified the bundles from 11 to 5 options
2019-05-10 19:56:04 -06:00
c30e30232f
Wait for installations 2019-05-10 19:55:01 -06:00
f5f4c79326
Major update for installing software bundles
* Initial versions of find_current_software() and find_missing_software()
  * Only covers browsers for now
* Expanded bundles for more fine-tuned installations
* Should fix failed installations in system_setup.py
2019-05-10 18:49:59 -06:00
70995f5dcf
Fixed calling install_adblock() 2019-05-10 17:40:17 -06:00
f17da656bb
Make all try_and_print results uppercase 2019-05-10 17:36:30 -06:00
a9c874d79e
Fixed LibreOffice installations 2019-05-10 17:28:21 -06:00
3bb2100dcd
Disable Office detection under HW mode 2019-05-10 17:09:32 -06:00
f0abf176e8
More formatting adjustments 2019-05-10 17:09:19 -06:00
cd9e89485e
Open Device Manager and Snappy in HW mode 2019-05-10 16:55:39 -06:00
f0e5b3945d
Added pause before exiting system setup 2019-05-10 16:55:12 -06:00
a6009b9923
Adjusted launchers 2019-05-10 16:47:43 -06:00
a07e4a4928
Adjusted formatting 2019-05-10 16:42:26 -06:00
f5f6e71516
Fix formatting when installing adblock 2019-05-10 16:41:34 -06:00
4985df805d
Improve detection of enabled AV products 2019-05-10 16:40:26 -06:00
06018125b2
Avoid crash due to missing error classes 2019-05-10 16:39:28 -06:00
6a1315a9f2
Bugfixes
* Ensure KWArgs is a dict
* Print action string not values
2019-05-10 16:38:31 -06:00
aa4356c08c
Added run actions section 2019-05-10 16:08:05 -06:00
e8457756fb
Handle WK-ClientDir cleanup action 2019-05-10 16:05:00 -06:00
97c5fc4c4d
Add special handling of Ninite action 2019-05-10 15:58:05 -06:00
a53050b78d
Fixed action options 2019-05-10 15:57:05 -06:00
de247c919b
Adjusted get_actions()
* Handle 'If answer' & 'Win10 Only' options
2019-05-10 14:25:00 -06:00
9553cbcbc8
Added system_setup.py
* Initial, incomplete re-implementation of new_system_setup.py
2019-05-08 20:42:47 -06:00
0101506f2c
Added check_os_support_status()
* Refactored from os_is_unsupported()
* Removed os_is_unsupported()
2019-05-08 20:41:16 -06:00
b3b13be5a7
Move speedtest to its own function 2019-05-08 20:40:26 -06:00
ea43d901ea
Silenced install_eset_nod32_av() 2019-05-08 20:39:56 -06:00
baebac669e
Avoid stall when enabling/installing uBlock Origin
* Fixes issue #89
2019-05-07 15:27:43 -06:00
7b65833c20
Added Python compatibilty check to d7II
* Fixes issue #84
2019-05-06 19:59:10 -06:00
07f2f338a2
Updated cleanup functions
* Fixes issue #77
2019-05-06 19:31:43 -06:00
a43c705f28
Store full ESET installer
* Allows for offline installs
* Avoids excessive downloads of the installer
* Fixes issue #71
2019-05-06 19:20:08 -06:00
67c5384e5b
Fix issue #85 2019-05-06 19:09:45 -06:00
b67a624038
Updated 1201 creds
* Addresses issue #43
2019-05-06 18:51:10 -06:00
5e75fffa86
Added 4K alignment check to checklists 2019-05-05 15:41:47 -06:00
dd08bc79e9
Use local LibreOffice installer in system setup 2019-05-05 15:14:11 -06:00
1df64c30f8
Include offline LibreOffice installer 2019-05-05 14:42:58 -06:00
b28a374cdb
Added 1201 WiFi
* Fixes issue #42
2019-05-05 12:50:10 -06:00
b63589c39e
Add known networks when building the Linux ISO
* Instead of at login
2019-05-05 12:48:44 -06:00
6bd57dd5a2
Use better filenames for upload_logdir() 2019-04-25 23:07:31 -07:00
bd08921f17
Post to osTicket before the upload for review 2019-04-25 23:06:37 -07:00
f473d315f8
Merge remote-tracking branch 'upstream/dev' into dev
* Fixes issue #72
2019-04-25 20:56:20 -07:00
c7309ad381
Skip Firefox during d7II
* Fixes issue #78
2019-04-25 20:41:41 -07:00
d9e062ca7e
Enable restore point creation in Snappy 2019-04-25 20:29:31 -07:00
fe6762cf05
Include more details when selecting a ticket
* Ticket ID is shown in BLUE
* Ticket subject is shown in CYAN
* Fixes issue #68
2019-04-25 20:16:02 -07:00
2a0a80b09a
Show error if ticket not found
* Fixes issue #80
2019-04-25 19:45:18 -07:00
f6fdc047cf
Post quick SMART results if run from menu
* --quick argument still disables osTicket integration
* Fixes issue #81
2019-04-25 19:28:34 -07:00
eb80580794
Merge remote-tracking branch 'upstream/dev' into dev 2019-04-25 19:18:20 -07:00
60bfa373e2
Added support for ESET SysRescue and HDClone 2019-04-20 20:15:28 -07:00
a0db819a76
Apply upstream SystemExit fix to all scripts 2019-04-20 18:59:43 -07:00
a0f4d74656
Merge remote-tracking branch 'upstream/dev' into dev 2019-04-20 18:57:10 -07:00
8a6dfc5cdf
Include disk volume report if only I/O fails
* Fixes issue #76
2019-04-11 22:01:00 -07:00
54fe08545e
Merge remote-tracking branch 'upstream/dev' into dev 2019-04-08 15:59:41 -07:00
7eaa5d73cd
Merge remote-tracking branch 'upstream/dev' into dev 2019-04-07 19:40:39 -07:00
1c7677d805
Skip renaming Copy WizardKit.cmd
* It isn't used anymore
2019-04-07 19:39:30 -07:00
414e3e2128
v1.8.0
Main Kit
* Hide Cortana search bar but keep icon during New System Setup
* Disable more parts of Tips & Tricks
* Detect and update browsers in Install SW Bundle
* Include more steps from Windows 10 fresh start in New System Setup
* Adjust Windows Update settings during System Checklist and New System Setup
* Restart Explorer after adjusting settings to show them immediately
* Show warning if Python can't be run and how to fix it
* Added prompt to run Post-d7II as a reminder
* Snappy Driver Installer Origin is now opened during the System Checklist
* Internet Explorer is no longer configured by the scripts
* Better error handling when disabling Windows Updates during d7II
* PowerShell is replaced by CMD in the Win+X menu in new setups and checklist
* Fixed WizTree extraction
* Fixed issues #46, #50, #57, #59, #60, & #65
* Fixed GitHub issues #91, #93, & #97
* Various other bug fixes

Linux
* Major upgrades to Hardware Diagnostics
  * Prime95 testing will auto-abort if a specified thermal limit is reached
  * NVMe / SMART is rechecked after all disk tests have been performed
    * This more acurately report data if other tests run into an error
  * Added maximum NVMe / SMART values
    * Attributes will not fail disks if the value is above the maximum value
  * Improved SMART short self-test support
  * Support running badblocks on disks over 4TB
  * osTicket improvements
    * Adjusted post formatting for consistency
    * Added retry connection option
    * Include filesystem type in volume reports
    * Show ticket ID and name during testing
    * Include ticket ID and name in osTicket posts
* Show estimated completion time in ddrescue-tui
* Added ldmtool to support reading MS Dynamic volumes
* Fexed issues 45, 49, 51, 53, 54, 55, 56, 58, & 61
* Fixed GitHub issues #58, #88, #89, #90, #92, #94, #95, #96, #99, & #100
* Various other bug fixes

Misc
* Improved build-ufd script
  * Find and copy WinPE files case-insensitively
  * Better logging
* Moved script settings to separate files
  * For easier configuration
* Fixed issue #47
2019-04-03 13:47:44 -07:00
6a7ef8ebcb
Merge remote-tracking branch 'upstream/dev' into dev 2019-04-02 16:37:09 -07:00
ff7cd410f9
New theme 2019-03-30 10:16:01 -07:00
e147dbc6d2
Merge remote-tracking branch 'upstream/dev' into dev 2019-03-30 09:49:15 -07:00
d6de2c5b65
Merge remote-tracking branch 'upstream/dev' into dev 2019-03-30 09:47:56 -07:00
c9c1007eaa
Merge remote-tracking branch 'upstream/dev' into dev
* Fixes issue #61
2019-03-20 15:49:35 -06:00
679a0329cc
Merge remote-tracking branch 'upstream/dev' into dev 2019-03-20 12:59:25 -06:00
df1706a8bf
Disabled speedtest in d7II mode, moved to Post-d7
* Also updated post_d7.py to use 2-space indentation
2019-03-19 20:49:32 -06:00
a4f57787e7
Merge remote-tracking branch 'upstream/dev' into dev 2019-03-19 20:46:48 -06:00
26199cf271
Detect and update browsers in Install SW Bundle
* Fixes issue #65
2019-03-19 20:31:00 -06:00
1e21b1bd59
Match formatting when enabling Windows Updates 2019-03-19 20:24:42 -06:00
3f96a31e1e
Fixed opening Snappy Driver Installer Origin
* Set working dir so the config file is read
* Pipe output to prevent flooding the screen with debug data
2019-03-19 19:03:16 -06:00
569810c3ca
Merge remote-tracking branch 'upstream/dev' into dev
Fixes issue #57
2019-03-19 14:20:31 -06:00
6d7a5e1eae
Updated system_checklist_hw.py 2019-03-17 21:25:04 -06:00
2218c03172
Merge remote-tracking branch 'upstream/dev' into dev 2019-03-17 21:08:29 -06:00
f73a1f8191
Open SDI Origin in New System Checklist
* Addresses issue #60
2019-03-17 21:02:42 -06:00
1fbdb2b5e2
Replace PowerShell with CMD in Win+X menu
* Addresses issue #60
2019-03-17 20:54:59 -06:00
6876d1c0ef
Fixed dict collision in Explorer settings
* Also updated section descriptions
* Addresses issue #60
2019-03-17 20:40:25 -06:00
89a09a322e
Add prompt to run Post-d7II script
* Best I can do for issue #52
2019-03-17 20:08:01 -06:00
ead4715c38
Also skip IE in reset_browsers and user_checklist
* More fixes for issue #59
2019-03-17 18:37:03 -06:00
2bde723c43
Skip Internet Explorer setup in new_system_setup()
* Fixes issue #59
2019-03-17 18:29:41 -06:00
a7926e58a4
Set wuauserv startup to manual when enabling
* This is the default in at Windows 10
* Fixes issue #46
2019-03-17 18:25:01 -06:00
f39bb8191e
Merge remote-tracking branch 'upstream/dev' into dev 2019-03-16 19:01:42 -06:00
e590547e3c
Show more details when disabling/enabling updates
* Fixes issue #46
2019-03-16 18:53:55 -06:00
5aeeb41995
Prevent updating OVERRIDE to PASS 2019-03-16 15:09:35 -06:00
9cad5419d8
Simplified osTicket post formatting 2019-03-14 01:04:14 -06:00
4aa50a044a
Adjusted osTicket post formatting 2019-03-14 00:37:55 -06:00
d447e694b2
Set NVMe/SMART test to FAIL if safety check fails
* Fixes issues #49
2019-03-14 00:22:11 -06:00
8835fb486d
Include ticket ID and name in osTicket posts
* Fixes issue #58
2019-03-13 23:01:32 -06:00
c73bf2521c
Include ticket ID and name in top pane
* Only if ticket ID and name are set
* Expands on fix for issue #58
2019-03-13 22:49:07 -06:00
4c3fe1d66f
Avoid crash if connection to osTicket fails 2019-03-13 22:26:42 -06:00
b6ecf348d4
Merge remote-tracking branch 'upstream/dev' into dev 2019-03-13 21:00:25 -06:00
809f338cd2
Use new NVMe/SMART report layout in osTicket posts
* Fixes issue #45
2019-03-13 20:57:14 -06:00
e0c3716e08
Avoid crash if fstype is None
* Set fstype to 'UNKNOWN FS' if it's an empty string or None
* Ensure all v_data values are strings before replacing text
* Fixes issue #53 (again)
2019-03-13 20:55:18 -06:00
62e78cdc2c
Skip uploading I/O Graphs if the test is disabled 2019-03-13 20:52:01 -06:00
b268385e0b
Merge remote-tracking branch 'upstream/dev' into dev 2019-03-13 19:04:01 -06:00
c45c1c9225
Merge remote-tracking branch 'upstream/dev' into dev
* Fixes issues #54 & #55
2019-03-12 22:45:43 -06:00
28ee4a3ed4
Merge remote-tracking branch 'upstream/dev' into dev 2019-02-28 00:18:21 -07:00
d8ce7f36e9
Expanded registry edits
* Disable edge swipe
* Add This PC to Desktop
* Add User's Files to Desktop
* Launch folders as separate process
* Addresses issue #60
2019-02-27 23:55:11 -07:00
63fa4d6f80
Show Cortana as taskbar icon instead of hiding 2019-02-27 22:09:21 -07:00
9333fb8f3e
Include filesystem type in volume reports
* Fixes issue #53
2019-02-26 22:07:14 -07:00
bc4fa92e16
Show ticket ID and name on results screen
* Fixes issue #58
2019-02-26 21:49:42 -07:00
054cf25811
Catch CTRL+c in new_system_setup.py
Fixes issue #50
2019-02-23 18:07:49 -07:00
85212fb171
Add retry option when connecting to osTicket
* Fixes issue #51
2019-02-23 17:49:40 -07:00
8be59c2c13
Fixed comment to match code 2019-02-23 16:32:16 -07:00
23ffcae432
Merge remote-tracking branch 'upstream/dev' into dev 2019-02-05 23:03:47 -07:00
697580f9a4
Merge remote-tracking branch 'upstream/dev' into dev 2019-02-05 22:25:57 -07:00
3428e9dff8
Merge remote-tracking branch 'upstream/dev' into dev
Fixed issue #41
2019-02-05 21:50:50 -07:00
e02cf4a602
Raised thermal limit to 99*C 2019-02-05 21:40:40 -07:00
4245d13375
Stop Prime95 if CoreTemps hit 95*C 2019-02-05 21:39:28 -07:00
e86b06b84d
v1.7.1 - Another World (bugfix)
* Avoid crash when running Install SW Bundle outside d7II
* Avoid rare crash when working with NVMe disks
* Avoid replacing osTicket disk checkbox FAILED values
2019-01-15 23:07:08 -07:00
9579d0fced
Prevent replacing disk checkbox FAILED value
* Addresses issue #40
2019-01-15 22:43:23 -07:00
a8ed58887d
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-15 19:07:51 -07:00
c29e84131b
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-15 18:59:11 -07:00
2c87021301
Avoid incorrectly updating osTicket disk checkbox
* Only update if disk tests are enabled and disk(s) were detected
* Addresses issue #40
2019-01-15 14:27:32 -07:00
402f3854d5
Avoid crash when installing Ninite bundle 2019-01-15 14:21:14 -07:00
0cef1d28eb
v1.7.0 - Another World
d7II
* Windows Updates are now disabled during the default process
* The Ninite bundle has been disabled from the Install SW Bundle step
  * Only in d7II, if run manually it will ask you which sections to install
* Fixed issue #32

Main Kit
* Updated tool versions
  * Added MS Office 2019 installers
  * Removed network installers
* Updated System Checklist
  * A System Restore point is created after enabling System Restore
  * BSoD mini dumps are now enabled
  * Windows Updates are now enabled
* Added "New System Setup" script
  * Combines "Install SW Bundle", "User Checklist", & "System Checklist"
* Added "Find User Wallpapers" script under "Data Transfers"
  * Copies wallpapers from common locations to a new folder for review
* Added Windows 1809 build numbers
* Fixed issues #16, #30, #31, #32, #33, #35
* Fixed GitHub issues #86 & #87
* Various other minor bug fixes

Linux
* Complete rewrite of HW Diagnostic sections
  * New main menu to improve clarity of selections
  * Allow overriding non-critical SMART attributes
    * NOTE: This doesn't apply to a full (disk) diagnostic
  * All tests can now be aborted with CTRL+c
  * Tmux panes are now resized appropriately if the window is resized
  * osTicket integration sections have also been rewritten
    * Posts are now more concise (i.e. Prime95 lines are merged if the same)
    * Disk PASS/FAIL logic has been adjusted to avoid incorrect posts
  * Various other enhancements and bugfixes
* Complete rewrite of HW Sensors sections
  * Temps are now tracked directly allowing for real "Max" values
* ddrescue-tui
  * Added safety check to ensure the map file is saved to persistent storage
  * Tmux panes are now resized appropriately if the window is resized
  * Added 'DDRESCUE PROCESS HALTED' message in red
    * Used to clearly indicate that user interaction is required
* If X fails to start it will fallback to HW-Diags CLI
* Added option to build Linux with a minimal package set
  * This is to better support newer Mac systems
  * This version includes additional Mac kernel modules
  * NOTE: Minimal builds are still considered experimental
* Fixed issues #23, #27, #28, #29, #34, #35, #37, & #38
* Fixed GitHub issues:
  * #67, #68, #69, #70, #71, #72, #73, #74, #75
  * #76, #77, #78, #80, #81, #82, #83, #84, & #85
* Various other minor bug fixes

Misc
* Replaced HDClone 6 with HDClone 5
  * NOTE: HDClone 5 was not working under Win10XPE in a VM so HDClone 6 was left as an alternative
* Updated all Python code to better follow to PEP8 guidelines
* Updated crash upload formatting for clarity
* Replaced CS/NS with PASS/FAIL or SUCCESS/FAIL as appropriate
2019-01-14 15:40:04 -07:00
a47579ab79
Disabled Ninite in d7II per request 2019-01-14 13:18:01 -07:00
6853e7bc21
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-13 18:06:04 -07:00
06b5ebe8b4
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-13 17:37:05 -07:00
a8536bf0d5
Forgot to include functions/windows_updates.py 2019-01-13 17:22:24 -07:00
1bc77334a4
Enable Windows Updates during checklist 2019-01-13 17:21:24 -07:00
07a92d2a8e
Downgraded to HDC5 2019-01-13 17:15:17 -07:00
eec4d01ddf
Added more SSH keys 2019-01-11 14:56:02 -07:00
da4ae79fcc
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-11 14:43:41 -07:00
4d600993e2
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-11 13:28:07 -07:00
adda1d76ae
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-11 13:11:02 -07:00
a419d4e808
Added find_user_wallpapers.py
* Fixes issue #16
2019-01-10 20:55:50 -07:00
d246ea1d86
New theme! 2019-01-09 22:00:05 -07:00
1dbbb41dd3
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-09 21:10:43 -07:00
4cb158b6b2
Removed duplicate docstring 2019-01-09 21:08:00 -07:00
7f0b53db40
Enable Windows Updates during system checklist
* Fixes issue #30
2019-01-09 19:07:40 -07:00
b7423ae3b5
Remove space from System Restore name 2019-01-09 19:03:52 -07:00
957a53ad12
Scan for browsers AFTER installing them 2019-01-09 18:44:02 -07:00
721a083c85
Bumped System Restore max size to 8%
* Per request in issue #31
2019-01-09 18:43:20 -07:00
d8e28ce785
Updated windows_updates.py 2019-01-09 18:25:07 -07:00
af46962fd7
Finished adding Windows Updates Tool to d7II 2019-01-09 17:10:05 -07:00
63501bbb28
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-09 16:30:21 -07:00
7944312309
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-08 23:55:42 -07:00
f20d8b5af3
Enable BSoD mini dumps during system checklists
* Fixes issue #33
2019-01-08 22:13:51 -07:00
6068b4390a
Create Restore Point during system checklists
* Fixes issue #31
2019-01-08 22:05:57 -07:00
931ce84d67
Added Windows Updates items to d7II
* NOTE: Still need added to default profile
2019-01-08 22:05:16 -07:00
827981d178
Wait for service to stop 2019-01-08 21:58:08 -07:00
8fef0a8e2f
Added windows_updates.py 2019-01-08 21:34:24 -07:00
990037e6c1
Added windows_updates.py 2019-01-08 20:53:32 -07:00
ceb3fc4835
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-08 20:33:53 -07:00
b372e19970
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-08 20:27:19 -07:00
187421a291
Fixed upload_crash_details() under Linux 2019-01-08 19:52:33 -07:00
2583358963
Missed a call to stop_tmux_repair_thread() 2019-01-08 19:34:17 -07:00
a839140ff4
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-08 19:25:39 -07:00
ac259c9c37
Revert "Avoid rare crash"
This reverts commit 23a88401b7.
* Didn't fix the issue, better fix available upstream
2019-01-08 19:23:38 -07:00
c4575db44c
Missed a 'CS' 2019-01-08 18:29:32 -07:00
23a88401b7
Avoid rare crash 2019-01-08 15:11:34 -07:00
1e5f72f79a
Switched to PASS/FAIL instead of CS/NS by request 2019-01-08 15:02:56 -07:00
a0a76ee15d
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-07 16:18:58 -07:00
83e96f9135
Fix issue #38 2019-01-07 16:13:24 -07:00
b1e5727d54
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-07 15:32:51 -07:00
53af3859e4
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-07 12:55:18 -07:00
014da1b224
Fix issue #37 2019-01-07 12:20:48 -07:00
0fcfc4b5ac
Merge remote-tracking branch 'upstream/dev' into dev 2019-01-07 12:12:28 -07:00
97d0125c03
Avoid crash in I/O Benchmark with small disks 2019-01-02 18:41:35 -07:00
49c1987ccf
Adjusted unsupported OS detection 2019-01-01 21:23:33 -07:00
88dffd7432
Added New System Setup
* This is a combination of the following scripts:
  * Install ESET AV
  * Install SW Bundle
  * User Checklist
  * System Checklist
2019-01-01 21:06:08 -07:00
dfe009c413
Added warning when failing to connect to osTicket
* Fixes issue #34
2018-12-28 18:01:10 -07:00
73bd9bb009
Merge remote-tracking branch 'upstream/dev' into dev 2018-12-28 17:49:17 -07:00
dd34c987fb
Merge remote-tracking branch 'upstream/dev' into dev 2018-12-28 17:04:39 -07:00
a5f7a04528
Merge remote-tracking branch 'upstream/dev' into dev 2018-12-27 23:48:42 -07:00
f3496ed795
Update 1201 sections to match upstream code 2018-12-27 23:28:33 -07:00
816ebd4d49
Merged more upstream PEP8 updates 2018-12-27 23:17:54 -07:00
103adc076a
Updated more files 2018-12-27 22:51:38 -07:00
279ebcf988
Updated some files to prep for upcoming PEP8 merge 2018-12-27 22:26:34 -07:00
e2fcacf579
Added extra line breaks to match upstream code 2018-12-27 22:11:09 -07:00
5a7a16588a
Merged upstream PEP8 updates 2018-12-27 22:03:14 -07:00
c40c80069f
Fix MemTest86 extraction 2018-12-27 17:51:46 -07:00
1e064bc9e6
Merge remote-tracking branch 'upstream/dev' into dev 2018-12-26 21:57:11 -07:00
c33d1b9706
Merge remote-tracking branch 'origin/hw-diags-rewrite' into dev 2018-12-26 21:54:07 -07:00
1d9c3b1869
Added posting results line to results screen 2018-12-26 21:50:34 -07:00
41b8d632ae
Fix disk checkbox logic 2018-12-26 21:32:03 -07:00
5cf2fa6f27
Added remaining osTicket sections 2018-12-26 20:57:30 -07:00
495e265de0
Only post results for devices with TestObj(s) 2018-12-26 20:45:00 -07:00
d9ab1730b4
Reset tunnel_proc to None on full disconnect 2018-12-26 20:44:20 -07:00
b3da1390a1
Only set disk.checkbox=True if all tests enabled 2018-12-26 20:43:17 -07:00
7205ac6c35
Added osTicket integration toggle to menu 2018-12-26 19:46:27 -07:00
ff715b7a10
Better exception handling for MariaDB sections 2018-12-26 19:31:07 -07:00
7d7cf21263
Show volume report if all disk tests are run
* Enable CoreStorage mounting only if all tests were CS, N/A, or OVERRIDE
2018-12-26 18:22:34 -07:00
2c0093aa9a
I/O graph export/upload sections working 2018-12-26 17:15:31 -07:00
12ea0fdd53
Posting disk results is working 2018-12-24 21:59:00 -07:00
b3f2a86f46
Add spacer line before Temps 2018-12-24 21:19:56 -07:00
8d6b29be53
Posting CPU results is working 2018-12-24 21:11:13 -07:00
ad6980f82b
Moved report functions into osTicket object 2018-12-24 17:33:54 -07:00
57572c7527
Added osTicket report sections 2018-12-24 17:10:12 -07:00
2372fb0d2f
Merge remote-tracking branch 'upstream/dev' into hw-diags-rewrite 2018-12-24 14:04:46 -07:00
ac40f61695
Readded Gnuplot and image upload functions 2018-12-22 23:47:30 -07:00
2750440c29
Readded osTicket functions 2018-12-22 23:42:57 -07:00
44bde68803
Removed unused get_status_color and Skipped status 2018-12-22 18:08:21 -07:00
fb77214340
Reworked status/color sections 2018-12-22 17:52:50 -07:00
9c34c08699
Merge remote-tracking branch 'upstream/dev' into dev 2018-12-20 17:27:27 -07:00
d8de2f196b
v1.6.3 - Thieves Build
Main Kit
* Added SecureBoot check to system checklists
* Expanded System Checklist
  * Added SecureBoot check
  * Enables RegBack
  * Enables SystemRestore
  * Windows 10 Explorer configuration
  * Unmutes audio before launching XMPlay
* New System Checklist (HW)
  * Reduced version of the System Checklist for HW check-ins
  * Enables RegBack & SystemRestore
  * System information backups
  * System summary
  * No other changes are made (i.e. Cortana, ClassicStart, etc)
* New WiFi Stability Test
* New uBlock Origin installation method for Firefox
  * It is installed via the registry, similar to Google Chrome
  * It is now installed for existing profiles
* Expanded post-d7II cleanup
* Improved ESET installation script
  * Should result in a fully 1201-configured installation
* Updated tools
  * Added Macs Fan Control
  * Added Furmark
  * Added O&O ShutUP10 (includes minimal preset to disable telemetry)
  * Added WinAIO presets
  * Replaced TreeSizeFree with WizTree
  * Updated Python to 3.7
* Disabled Caffeine (see GitHub issues #64 & #65)
* Removed Adobe Reader from Install SW Bundle
* Removed Visual C++ 2008 runtimes
* WizardKit crashes are now uploaded to 1201's Nextcloud server
* Fixed Gogs issues #4, #5, #7, #8, #10, #13, #14, #17, #18, & #21
* Fixed GitHub issues #51, #56, & #60
* Various other minor bug fixes

Linux
* Added osTicket integration
  * Enter the ticket ID and verify against the customer name
  * Prime95 CPU tests are posted along with the final temps
    * The temperature box is not filled out due to sensor variability
  * Drive results are posted for each drive tested
    * NVMe/SMART values
    * SMART built-in short-test (if available)
    * badblocks surface scan
    * I/O Benchmarks (including a PNG render of the graph)
    * Used space information for all volumes (only if all tests pass)
    * The pass/fail box is checked as appropriate
  * osTicket integration can be disabled per session if desired
* Added AMD CPU microcode and updated Intel CPU microcode
  * Includes current Meltdown/Spectre mitigations
* Added ddrescue-tui, a wrapper for ddrescue
  * Can be used to perform device-to-device and device-to-image clones
  * Can perform all three passes automatically (if certain thresholds are met)
  * Helps enforce safe usage of ddrescue to reduce drive stress
  * Shows SMART data while running (updates every 5 minutes)
  * Shows SystemD journal while running
  * NOTE: Please read the manual before adjusting advanced settings
* Improved network support for some Broadcom network devices
* Improved I/O Benchmark test in HW-Diags
  * Checks if the device is a SSD and uses the higher thresholds if so
  * Shows current read speed with graph while running
    * Speeds under 65 Mb/s are red
    * Speeds under 135 Mb/s are yellow
    * Speeds above 750 Mb/s are green
  * Shows graph along with AVG (MIN, MAX) in summary report
  * Only reads a portion of the drive, spread out evenly, to speedup the test
    * (It reads either 10 Gb or 1% of the drive, whichever is larger)
* Added SMART attribute 199/C7 as an important value in HW-Diags
  * If present and non-zero it prompts for an override to continue testing
    * This includes the question "Have you tried swapping the drive cable?"
* Lowered failure thresholds for several SMART attributes to match 1201 usage
* The hostname is now set using the current IP and a reverse DNS lookup
  * Useful for test-stations with static DHCP leases and DNS entries
* Added option to resume previous hw-diags `tmux` session
  * This allows you to more easily "move" the session to/from a SSH session
* Added a VNC server which runs at startup (unless booting CLI/nox)
* mount-all-volumes now supports non-encrypted CoreStorage volumes
* Added a lot of boot options for Mac systems, here's the order to try:
  * UEFI The default Linux option
  * UEFI Mac CLI
  * Legacy default Linux option
  * Legacy Mac CLI
  * Exact model entry (if available)
  * Mac Generic Fixes
* Added _limited_ support for HiDPI devices
* Fixed WizardKit UFD detection
  * The should be auto-excluded from HW-Diags again
* Restored missing photorec-sort script
* Removed HDT from legacy boot menu (see GitHub issue #57)
* Fixed issue where the IP address was not shown in Conky
* Fixed Gogs issues #1, #2, #3, #8, #9, #12, #15, #19, #20, #22, #25, & #26
* Fixed GitHub issues #39, #41, #43, #44, #45, #46, #47, #48, #49, #50, #52, #53, #54, #55, & #61
* Various other minor bug fixes

Win10XPE
* This replaces the CLI-only WinPE on the previous build
* This is loaded into RAM so the UFD can be removed after booting
* Starts a VNC server at startup (password `Sorted1201`)
* Includes HDClone
* Includes the WizardKit WinPE scripts for Windows network installs
* Limited support for running 32-bit tools
* Integrated most of the essential tools, notable exceptions below
  * HDTunePro due to a .NET/Visual C++ issue (HDTune 2.55 was used instead)
  * WinAIO Repairs due to the same .NET/Visual C++ issue
* Updated Python to 3.7

Misc
* Adjusted HDClone boot configuration
  * Hopefully will help system compatibility (if not Win10XPE can be used)
* BitDefender has been replaced by ESET SysRescueLive
* HDT has been disabled due to an upstream bug
2018-11-23 16:22:08 -07:00
2Shirt
598dc8020d Fix crash when aborting all tests
* Fixes issue #26
2018-10-15 12:26:18 -06:00
2Shirt
1795833334 Updated Syslinux boot config 2018-10-15 00:44:22 -06:00
2Shirt
5798d48342 Added ESET Online Scanner to update sections 2018-10-14 23:53:45 -06:00
2Shirt
34b426ae36 Fixed Linux boot options
* Set 'nox' for DEBUG entries
* Keep Syslinux theme for Linux (Extras) menu
2018-10-14 22:03:44 -06:00
2Shirt
dc1011ce5a Add Mac boot options for Linux
* Should help with identifying why some Macs won't boot to Linux
2018-10-14 21:00:47 -06:00
2Shirt
cc0c9a1795 Adjusted SMART thresholds 2018-10-14 18:08:13 -06:00
2Shirt
e1984a5417 Fixed WinAIO Launchers 2018-10-13 19:08:12 -06:00
2Shirt
41400d7710 Removed Update Kit 2018-10-13 19:06:51 -06:00
2Shirt
4c500f83a5 Add short delay between opening pages 2018-10-13 19:05:46 -06:00
2Shirt
742a944ace Renamed privacy sections 2018-10-13 18:31:15 -06:00
2Shirt
26e8c93282 Adjusted RegBack sections
* Labeled more accurately in system checklists
* Isolated into a separate enable_regback() function
2018-10-12 16:41:51 -06:00
2Shirt
05a9245a4c Allow special characters in network passwords 2018-10-12 15:49:45 -06:00
2Shirt
79713c700f Reduced AppWaitTime values 2018-10-12 14:09:39 -06:00
2Shirt
08ded5311f Updated system_diagnostics.py 2018-10-12 13:59:56 -06:00
2Shirt
e7c519f605 Only run DISM for Win8+
* Avoids pausing the script for "Unsupported OS" "errors"
2018-10-12 12:58:44 -06:00
2Shirt
dab3bb5f68 Updated list of Windows builds 2018-10-12 12:54:21 -06:00
2Shirt
a6893cda4c Add Thieves Build images 2018-10-11 16:32:40 -06:00
2Shirt
b544787ae6 Mount backup shares RW from CLI 2018-10-11 14:57:42 -06:00
2Shirt
f0179ec962 Show volume usage for all devices
* Don't CoreStorage scans for failed devices
* Fixes issue #25
2018-10-11 14:56:01 -06:00
3216c2f46b
Added public keys 2018-10-10 19:39:56 -06:00
f8291d91c8
v1.6.2 - Thieves Build
Main Kit
* Added SecureBoot check to system checklists
* Expanded System Checklist
  * Added SecureBoot check
  * Enables RegBack
  * Enables SystemRestore
  * Windows 10 Explorer configuration
  * Unmutes audio before launching XMPlay
* New System Checklist (HW)
  * Reduced version of the System Checklist for HW check-ins
  * Enables RegBack & SystemRestore
  * System information backups
  * System summary
  * No other changes are made (i.e. Cortana, ClassicStart, etc)
* New WiFi Stability Test
* New uBlock Origin installation method for Firefox
  * It is installed via the registry, similar to Google Chrome
  * It is now installed for existing profiles
* Expanded post-d7II cleanup
* Improved ESET installation script
  * Should result in a fully 1201-configured installation
* Updated tools
  * Added Macs Fan Control
  * Added Furmark
  * Added O&O ShutUP10 (includes minimal preset to disable telemetry)
  * Added WinAIO presets
  * Replaced TreeSizeFree with WizTree
  * Updated Python to 3.7
* Disabled Caffeine (see GitHub issues #64 & #65)
* Removed Adobe Reader from Install SW Bundle
* Removed Visual C++ 2008 runtimes
* WizardKit crashes are now uploaded to 1201's Nextcloud server
* Fixed Gogs issues #4, #5, #7, #8, #10, #13, #14, #17, #18, & #21
* Fixed GitHub issues #51, #56, & #60
* Various other minor bug fixes

Linux
* Added osTicket integration
  * Enter the ticket ID and verify against the customer name
  * Prime95 CPU tests are posted along with the final temps
    * The temperature box is not filled out due to sensor variability
  * Drive results are posted for each drive tested
    * NVMe/SMART values
    * SMART built-in short-test (if available)
    * badblocks surface scan
    * I/O Benchmarks (including a PNG render of the graph)
    * Used space information for all volumes (only if all tests pass)
    * The pass/fail box is checked as appropriate
  * osTicket integration can be disabled per session if desired
* Added AMD CPU microcode and updated Intel CPU microcode
  * Includes current Meltdown/Spectre mitigations
* Added ddrescue-tui, a wrapper for ddrescue
  * Can be used to perform device-to-device and device-to-image clones
  * Can perform all three passes automatically (if certain thresholds are met)
  * Helps enforce safe usage of ddrescue to reduce drive stress
  * Shows SMART data while running (updates every 5 minutes)
  * Shows SystemD journal while running
  * NOTE: Please read the manual before adjusting advanced settings
* Improved network support for some Broadcom network devices
* Improved I/O Benchmark test in HW-Diags
  * Checks if the device is a SSD and uses the higher thresholds if so
  * Shows current read speed with graph while running
    * Speeds under 65 Mb/s are red
    * Speeds under 135 Mb/s are yellow
    * Speeds above 750 Mb/s are green
  * Shows graph along with AVG (MIN, MAX) in summary report
  * Only reads a portion of the drive, spread out evenly, to speedup the test
    * (It reads either 10 Gb or 1% of the drive, whichever is larger)
* Added SMART attribute 199/C7 as an important value in HW-Diags
  * If present and non-zero it prompts for an override to continue testing
    * This includes the question "Have you tried swapping the drive cable?"
* The hostname is now set using the current IP and a reverse DNS lookup
  * Useful for test-stations with static DHCP leases and DNS entries
* Added option to resume previous hw-diags `tmux` session
  * This allows you to more easily "move" the session to/from a SSH session
* Added a VNC server which runs at startup (unless booting CLI/nox)
* mount-all-volumes now supports non-encrypted CoreStorage volumes
* Added _limited_ support for HiDPI devices
* Fixed WizardKit UFD detection
  * The should be auto-excluded from HW-Diags again
* Restored missing photorec-sort script
* Removed HDT from legacy boot menu (see GitHub issue #57)
* Fixed issue where the IP address was not shown in Conky
* Fixed Gogs issues #1, #2, #3, #8, #9, #12, #15, #19, #20, & #22
* Fixed GitHub issues #39, #41, #43, #44, #45, #46, #47, #48, #49, #50, #52, #53, #54, #55, & #61
* Various other minor bug fixes

WinPE
* Updated Python to 3.7

Misc
* HDT has been disabled due to an upstream bug
2018-10-10 18:56:24 -06:00
31b029c828
v1.6.1 - Thieves Build
Main Kit
* Added SecureBoot check to system checklists
* Expanded System Checklist
  * Added SecureBoot check
  * Enables RegBack
  * Enables SystemRestore
  * Windows 10 Explorer configuration
  * Unmutes audio before launching XMPlay
* New System Checklist (HW)
  * Reduced version of the System Checklist for HW check-ins
  * Enables RegBack & SystemRestore
  * System information backups
  * System summary
  * No other changes are made (i.e. Cortana, ClassicStart, etc)
* New WiFi Stability Test
* New uBlock Origin installation method for Firefox
  * It is installed via the registry, similar to Google Chrome
  * It is now installed for existing profiles
* Expanded post-d7II cleanup
* Improved ESET installation script
  * Should result in a fully 1201-configured installation
* Updated tools
  * Added Macs Fan Control
  * Added Furmark
  * Added O&O ShutUP10 (includes minimal preset to disable telemetry)
  * Added WinAIO presets
  * Replaced TreeSizeFree with WizTree
  * Updated Python to 3.7
* Disabled Caffeine (see GitHub issues #64 & #65)
* Removed Adobe Reader from Install SW Bundle
* Removed Visual C++ 2008 runtimes
* WizardKit crashes are now uploaded to 1201's Nextcloud server
* Fixed Gogs issues #4, #5, #7, #8, #10, #13, #14, #17, #18, & #21
* Fixed GitHub issues #51, #56, & #60
* Various other minor bug fixes

Linux
* Added osTicket integration
  * Enter the ticket ID and verify against the customer name
  * Prime95 CPU tests are posted along with the final temps
    * The temperature box is not filled out due to sensor variability
  * Drive results are posted for each drive tested
    * NVMe/SMART values
    * SMART built-in short-test (if available)
    * badblocks surface scan
    * I/O Benchmarks (including a PNG render of the graph)
    * Used space information for all volumes (only if all tests pass)
    * The pass/fail box is checked as appropriate
  * osTicket integration can be disabled per session if desired
* Added AMD CPU microcode and updated Intel CPU microcode
  * Includes current Meltdown/Spectre mitigations
* Added ddrescue-tui, a wrapper for ddrescue
  * Can be used to perform device-to-device and device-to-image clones
  * Can perform all three passes automatically (if certain thresholds are met)
  * Helps enforce safe usage of ddrescue to reduce drive stress
  * Shows SMART data while running (updates every 5 minutes)
  * Shows SystemD journal while running
  * NOTE: Please read the manual before adjusting advanced settings
* Improved network support for some Broadcom network devices
* Improved I/O Benchmark test in HW-Diags
  * Checks if the device is a SSD and uses the higher thresholds if so
  * Shows current read speed with graph while running
    * Speeds under 65 Mb/s are red
    * Speeds under 135 Mb/s are yellow
    * Speeds above 750 Mb/s are green
  * Shows graph along with AVG (MIN, MAX) in summary report
  * Only reads a portion of the drive, spread out evenly, to speedup the test
    * (It reads either 10 Gb or 1% of the drive, whichever is larger)
* Added SMART attribute 199/C7 as an important value in HW-Diags
  * If present and non-zero it prompts for an override to continue testing
    * This includes the question "Have you tried swapping the drive cable?"
* The hostname is now set using the current IP and a reverse DNS lookup
  * Useful for test-stations with static DHCP leases and DNS entries
* Added option to resume previous hw-diags `tmux` session
  * This allows you to more easily "move" the session to/from a SSH session
* Added a VNC server which runs at startup (unless booting CLI/nox)
* mount-all-volumes now supports non-encrypted CoreStorage volumes
* Added _limited_ support for HiDPI devices
* Fixed WizardKit UFD detection
  * The should be auto-excluded from HW-Diags again
* Restored missing photorec-sort script
* Removed HDT from legacy boot menu (see GitHub issue #57)
* Fixed issue where the IP address was not shown in Conky
* Fixed Gogs issues #1, #2, #3, #8, #9, #12, #15, #19, #20, & #22
* Fixed GitHub issues #39, #41, #43, #44, #45, #46, #47, #48, #49, #50, #52, #53, #54, #55, & #61
* Various other minor bug fixes

WinPE
* Updated Python to 3.7

Misc
* HDT has been disabled due to an upstream bug
2018-10-10 18:43:38 -06:00
1cd326e2ea
Merge remote-tracking branch 'upstream/dev' into dev 2018-10-10 17:08:19 -06:00
527049cdb2
Merge remote-tracking branch 'upstream/dev' into dev 2018-10-10 16:45:43 -06:00
2Shirt
3bb8e786e4 Merge branch 'd7' into dev 2018-10-09 00:28:14 -06:00
2Shirt
09994a7c73 Adjusted main d7II settings
* Added 1201 logo
* Disabled news bar
2018-10-09 00:25:23 -06:00
2Shirt
b4acdad3f0 Adjusted tool download frequency 2018-10-09 00:24:35 -06:00
2Shirt
1c5b4bbfd8 Updated d7II configs 2018-10-08 23:26:27 -06:00
2Shirt
73654b2213 Added d7II config files (from 2018-08) 2018-10-08 23:12:35 -06:00
2Shirt
93e4bd5c0f Fix cleanup_d7ii() 2018-10-08 21:47:11 -06:00
2Shirt
122df6240c Create new ClientDir folders to prevent crashes 2018-10-08 21:46:50 -06:00
2Shirt
fb9731539f Added set_log_file() 2018-10-08 21:44:38 -06:00
2Shirt
4afbc1a0a4 Cleanup ClientDir during post_d7.py 2018-10-07 22:09:20 -06:00
2Shirt
bff141ff8d Restore default UAC settings in post_d7.py 2018-10-07 22:03:30 -06:00
2Shirt
47aeed6146 Updated Notepad++ settings
* Show menu, status bar, and tabs
* Allow scrolling beyond last line
2018-10-07 21:40:54 -06:00
2Shirt
8d0ad7c20d Cleanup ClientDir during the System Checklists 2018-10-07 21:29:57 -06:00
2Shirt
a8a2fce662 Added delete_empty_folders()
* Deletes folders only if they're empty and does so from the bottom up
  * (i.e. "Some\Path" will be removed before "Some")
2018-10-07 21:23:10 -06:00
2Shirt
ceae05817d Delete ESET installer after setup 2018-10-07 21:10:28 -06:00
2Shirt
f9ab36fc7c Reorganized ClientDir
* "ClientDir\Info" renamed to "ClientDir\Logs"
  * Logs are sorted into subdirs based on the source:
  * KIT_NAME_FULL: WizardKit logs
  * d7II: d7II logs
  * Tools: Logs from tools called by WizardKit or d7II
  * (no subdir): System information
* "ClientDir\Backups"
  * Switched to "Backups\Source\{Date}" from "Backups\{Date}\Source"
2018-10-07 21:04:41 -06:00
2Shirt
8189d412eb Enabled ERUNT registry backup in d7 diagnostics 2018-10-07 19:05:39 -06:00
2Shirt
877a9c6634 Added second ShutUp10 launcher 2018-10-07 16:45:33 -06:00
2Shirt
85653593df Add Linux Reader 2018-10-07 14:39:17 -06:00
2Shirt
3c3eada6a7 Removed temp size from system checklist 2018-10-07 14:38:45 -06:00
2Shirt
ebc040cd56 Adjusted formatting 2018-10-07 14:37:59 -06:00
2Shirt
a7fd06598d Add HDTune launcher 2018-10-07 14:37:20 -06:00
2Shirt
0546ac3e84 Fixed updating WinAIO Repair 2018-10-07 14:36:20 -06:00
2Shirt
56a74798e5 Fixed unmute command 2018-10-07 14:32:14 -06:00
2Shirt
8e95eb5010 Disabled Caffeine 2018-10-07 14:31:32 -06:00
2Shirt
f1b3ffb483 Updated d7II cleanup for Windows 7 2018-10-07 14:31:01 -06:00
2Shirt
3c950e3c56 Adjusted System Diagnostic formatting 2018-10-07 14:28:37 -06:00
2Shirt
63086dcb1e Added 1201 Root CA
* Allows uploaded crash reports under Windows
2018-10-06 22:27:33 -06:00
2Shirt
b495ce399d Removed Adobe Reader from SW Bundle 2018-10-06 21:49:26 -06:00
2Shirt
b1f495dada Updated ESET installation sections
* Apply user config before installation
  * Disables splash screen and desktop notifications
* Call update_eset_config() in update_kit.py
* Fixed install_eset_nod32_av()
* Moved ESET launcher to Installers
2018-10-06 21:41:20 -06:00
2Shirt
f5caaf09c2 Fixed updateshutup10() 2018-10-06 19:20:29 -06:00
2Shirt
f097b98c85 Fixed update_furmark() and add FurMark Launcher 2018-10-06 19:19:14 -06:00
2Shirt
e642bfd2d3 Fix WK device detection to omit from HW-Diags 2018-10-04 13:56:16 -06:00
2Shirt
ba302f0c5b Add SMART short test results to osTicket report 2018-10-03 23:52:23 -06:00
2Shirt
cdb0963139 Remove timeout for remount-rw 2018-10-03 23:32:04 -06:00
2Shirt
5ad18a7fee Show warning if there were issue(s) posting 2018-10-03 23:30:55 -06:00
2Shirt
e56647ed48 Fix drive report for aborted tests 2018-10-03 23:30:21 -06:00
2Shirt
117a47e94c Refactored DB connection sections
* Connect for each post instead of once per session
* Restart the SSH tunnel if it was closed
* Avoid issue where the connection(s) were broken by aborting Prime95
2018-10-03 23:25:15 -06:00
2Shirt
00b3c405d0 Show more precice amount recovered 2018-10-03 20:10:43 -06:00
2Shirt
2a1cc81e46 Added O&O ShutUp10 2018-10-03 20:06:41 -06:00
2Shirt
1b5e05b81a Use different thresholds for HDDs and SSDs
* Fixes issue #22
2018-10-03 19:43:53 -06:00
2Shirt
e4410b1258 Expanded Post-D7II Cleanup
* Fixes issue #4
2018-10-03 16:19:42 -06:00
2Shirt
6bd29e402c Add Furmark
* Fixes issue #10
2018-10-03 14:32:29 -06:00
2Shirt
e2c07d5710 Add Macs Fan Control
* Fixes issue #7
2018-10-03 14:07:42 -06:00
2Shirt
5c34ebf34b Add WinAIO Repair presets
* Fixes issue #21
2018-10-03 14:02:20 -06:00
2Shirt
7b57329dee Post drive details for skipped devices 2018-10-03 13:55:30 -06:00
2Shirt
08768424f0 Post Prime95 results for aborted tests 2018-10-03 13:54:58 -06:00
2Shirt
904b41dbae Disable PeopleBar and Tips and Tricks 2018-10-03 13:48:46 -06:00
2Shirt
4c0596b2df Don't crash when showing Secure Boot alerts 2018-10-03 01:16:11 -06:00
2Shirt
e3d62eab15 Added network stability test
* Fixes issue #17
2018-10-03 00:19:25 -06:00
2Shirt
41b4a258f6 Added System Checklist (HW)
* Only applies a minimal amount of changes to the system
* Fixes issue #13
2018-10-02 23:53:46 -06:00
2Shirt
6178ae81cd Actually show Secure Boot alerts 2018-10-02 23:50:11 -06:00
2Shirt
80e903577e Enable RegBack during system checklist
* Fixes issue #18
2018-10-02 23:40:51 -06:00
2Shirt
171eb0722f Enable System Restore during system checklist
* Fixes issue #14
2018-10-02 23:35:15 -06:00
2Shirt
a643b38bbe Also show alert box for Secure Boot issues 2018-10-02 23:12:11 -06:00
2Shirt
588fa8d51a Merge remote-tracking branch 'upstream/dev' into dev 2018-10-02 23:10:26 -06:00
b669b221f9
Merge remote-tracking branch 'upstream/dev' into dev 2018-10-02 22:25:02 -06:00
b7dc524096
Include ticket number in log 2018-10-01 19:46:08 -06:00
83984cd6ee
Adjust used space report for osTicket
* Include volume total, used, and free space
* Space using dots for improved readability
* Adjust total size notation to match other sizes
2018-10-01 19:43:02 -06:00
6854d5bad7
Adjust NVMe test status logic
* If the quick check is ok then the normal check is also ok
  * (Because there's no NVMe short test as there is in SMART)
2018-10-01 19:40:21 -06:00
6c37c344ce
Prevent crash in hw_diags when testing NVMe drives 2018-10-01 19:36:19 -06:00
7e78eb5dca
Respect ENABLE_OPEN_LOGS global variable 2018-10-01 19:35:46 -06:00
0d35d81b97
Include used space in disk reports for osTicket
* Used space info is not included if the drive failed the test(s)
2018-10-01 13:00:21 -06:00
25d3413986
Merge remote-tracking branch 'upstream/dev' into dev 2018-09-29 15:35:31 -06:00
30141916b4
Typo 2018-09-29 14:36:31 -06:00
162712871e
Add option to mount all volumes for a specific dev 2018-09-29 14:31:16 -06:00
0fae4128ed
Adjusted Prime95 osTicket report
* Post report regardless of result
2018-09-29 13:25:10 -06:00
824c184d59
Fix issue #20 2018-09-29 12:55:02 -06:00
1a007e37ad
Adjusted osticket.1201.com SSH host key 2018-09-28 15:39:50 -06:00
03736998cf
Merge remote-tracking branch 'upstream/dev' into dev 2018-09-28 14:37:57 -06:00
f35869b2b0
Fix crash when running the quick drive test 2018-09-28 14:03:55 -06:00
aa1fda8ac4
Show test results in osTicket report
* Fixes issue #19
2018-09-28 13:43:18 -06:00
dc8f48a6b4
Update post_drive_results() to use new I/O Status 2018-09-28 13:32:48 -06:00
91b7149f93
Merge remote-tracking branch 'upstream/dev' into dev 2018-09-28 13:29:58 -06:00
6cf74c0361
Removed trust commands from Build Linux 2018-09-28 13:12:46 -06:00
66cfe2b246
Update CA trust during startup 2018-09-28 13:11:28 -06:00
cd1017b522
Removed typo'd linebreak 2018-09-26 18:03:12 -06:00
08e8396c27
Updated WiFi creds 2018-09-26 13:51:29 -06:00
a17c83e5f3
Merge remote-tracking branch 'upstream/dev' into dev 2018-09-25 21:24:16 -06:00
9f5a8ace72
Merge branch '1201' into dev 2018-09-25 21:08:34 -06:00
79ad9f1412
Added 1201 specific boot entries 2018-09-25 21:06:23 -06:00
5658b19cac
Merge branch 'dev' into 1201 2018-09-25 14:51:32 -06:00
ba5c380b78
Merge branch 'osticket_integration' into dev 2018-09-25 14:40:41 -06:00
787e944cd1
Add 1201 Root CA 2018-09-25 14:18:44 -06:00
251bc37fb6
Updated main.py 2018-09-25 13:57:43 -06:00
402d73c395
Add osticket.1201.com to known_hosts 2018-09-25 13:57:28 -06:00
e9d65fe29b
Enable direct I/O for I/O Benchmark
* Really this should've been enabled earlier
* Also increased chunk size
2018-09-24 17:49:20 -06:00
7506cd017b
PNG graph export and uploads working 2018-09-24 17:47:52 -06:00
8d5a4b4079
Add python-gnuplot package 2018-09-24 16:07:23 -06:00
4206afe0c3
Disabled osticket_needs_attention()
* The flag has been repurposed in osTicket
2018-09-24 15:45:52 -06:00
aec3e8208c
New osTicket report layout
* Block character graph has been reduced to one line
* A PNG graph is exported using gnuplot
* The graph is uploaded to imgur and a link is included in the report
* The graph is also uploaded to the BENCHMARK_SERVER for redundancy
2018-09-24 02:27:02 -06:00
ba06b7d635
Increased height of horizontal I/O graph
* Allows for 32 steps of accuracy
* Adjusted curve to max out around 750 Mb/s
2018-09-20 15:57:53 -06:00
d46ae18045
Establish SSH tunnel before connecting to SQL DB
* Also added disconnect_from_db() function.
2018-09-20 14:53:17 -06:00
462a87b1ce
Adjusted ticket selection confirmation 2018-09-20 12:50:13 -06:00
146244d3fd
Adjusted osTicket post formatting 2018-09-20 12:02:08 -06:00
aae7c1d543
Allow diabling osTicket integration per run 2018-09-20 00:58:21 -06:00
dd13f7bd24
Adjusted osTicket drive report formatting 2018-09-20 00:50:32 -06:00
9698cfbf6d
Initial osTicket drive report section
* Formatting is off, need to remove ASCII color escapes
2018-09-20 00:35:05 -06:00
580d1de915
Finished Prime95 osTicket reply section
* NOTE: A reply is not posted for Aborted tests or Unknown results
2018-09-18 21:48:15 -06:00
1d88c57be8
Adjust Prime95 countown message 2018-09-18 20:43:09 -06:00
5edde45f0e
Get osTicket number and verify with name in ticket 2018-09-18 20:33:33 -06:00
58dead2382
Added osTicket DB functions
* osticket_needs_attention()
* osticket_reply()
* osticket_set_drive_result()
2018-09-18 19:55:36 -06:00
555a661e92
Added connet_to_db() function to hw-diags.py
* Uses new main.py variables
* Only runs if non-quick drive test(s) are selected
2018-09-18 16:14:46 -06:00
5bb3f48d4e
Merge branch 'dev' into 1201 2018-09-17 20:40:07 -06:00
73367d2cde
Merge remote-tracking branch 'upstream/dev' into dev 2018-09-17 20:26:45 -06:00
Alan Mason
06ab30e909 Update 'LICENSE.txt' 2018-09-05 13:45:45 -07:00
92822a1458
Merge branch 'dev' into 1201 2018-09-03 23:14:49 -06:00
b6ea2855eb
Merge remote-tracking branch upstream/dev into dev 2018-09-03 23:14:32 -06:00
4837f266a9
Merge branch 'dev' into 1201 2018-09-03 23:10:19 -06:00
ddb40f4bc0
Merge remote-tracking branch upstream/dev into dev 2018-09-03 23:09:53 -06:00
2756d57395
Merge branch 'datarec' into dev 2018-09-03 23:09:08 -06:00
7d1850a480
Allow BleachBit to be run more than once per day 2018-08-30 11:27:47 -07:00
b043b63d2d
Don't ask to install MSE in D7_MODE 2018-08-30 10:59:46 -07:00
b9b7b0456a
Fix error detection in SW Diags (again) 2018-08-30 10:58:31 -07:00
3875d4b2bd
Fix error detection in SW Diags 2018-08-21 12:14:17 -07:00
c25a46b49f
Let's not remove browser history 2018-08-21 12:03:31 -07:00
5b08a3b4b4
Updated README.md 2018-08-20 02:44:52 -07:00
84f3a4e819
Removed LICENSE.txt 2018-08-20 02:44:46 -07:00
02a1593203
Merge 'upstream/dev' into 1201 2018-08-20 02:36:48 -07:00
887cfd9f92
Bugfix: typo 2018-08-20 02:31:22 -07:00
7bce6076c8
Added more d7II launchers 2018-08-20 02:30:50 -07:00
33d1f42002
Add WinAIO Repair 2018-08-19 18:09:39 -07:00
2301c89b8c
Add ESET NOD32 AV install sections
* Installs with custom config
2018-08-19 17:32:55 -07:00
84120f1505
Adjusted launchers for d7II 2018-08-19 15:59:58 -07:00
6f3a1ee55f
Run BleachBit cleaners directly and allow cleaning
* Using the cleaner names to ensure desired cleanup
  * Using the --preset option could lead to unintended deletions
* Cleaning is automatic in D7_MODE
2018-08-19 15:18:29 -07:00
9c1c8b90be
Added d7II Cleanup sections
* Renamed d7_firefox_fix.py to post_d7.py
  * This will include all items that need to be run outside d7II
2018-08-19 14:10:37 -07:00
edb82df4d3
Move AdwCleaner/Desktop to LogDir during cleanup
* Instead of ProgBackupDir
2018-08-19 13:24:39 -07:00
42c5e918b6
Added Registry backups to system_checklist cleanup 2018-08-19 13:12:03 -07:00
4f2f696d60
Adjust backup paths for cleanup functions 2018-08-19 12:55:55 -07:00
251c232a6e
Added Emsisoft a2cmd to system_checklist cleanup 2018-08-19 12:50:36 -07:00
39f947bdd1
Leave SW Diags window open in D7_MODE on error(s) 2018-08-19 12:26:58 -07:00
4e022ed843
Run DISM RestoreHealth in D7_MODE 2018-08-19 12:14:34 -07:00
31a3d5a43b
Added D7_MODE to install_sw_bundle.py 2018-08-19 12:04:11 -07:00
1244b7f5e5
New SW Bundles
* Removed Air, Java, & Silverlight
* Added SumatraPDF
2018-08-19 11:53:33 -07:00
298222c9fc
Password protect browser backups 2018-08-18 18:46:17 -07:00
2369786b66
Bugfix: d7_firefox_fix.py 2018-08-18 18:10:54 -07:00
ceba2e5ff2
Add d7/Firefox workaround
* When Firefox is run from d7ii all tabs crash thus preventing installing uBO
* Added d7_forefix_fix.py to install uBO just for mozilla-type browsers
2018-08-18 17:53:50 -07:00
241f5cb897
Always open the uBlock store page for FF
* If d7 defaults are run then uBO may still need installed
2018-08-18 17:15:10 -07:00
90a9751883
More bugfixes for reset_browser split 2018-08-18 17:09:55 -07:00
b57374b177
Fix D7_MODE logic in reset_browsers (again)
* Went wrong direction last time
2018-08-18 16:47:09 -07:00
c16a540b3e
Fix D7_MODE logic in reset_browsers.py 2018-08-18 16:41:52 -07:00
712eeff79e
Set default main.py values for 1201 2018-08-18 16:26:17 -07:00
9f77b532b6
New reset_browsers script for use in d7ii
* Adjusted user_checklist as well
2018-08-18 15:49:12 -07:00
b42f393a1a
Always configure browsers/classicshell/explorer 2018-08-18 15:28:33 -07:00
ed3323fffb
Updated system checklist/diags and user checklits
* Added D7_MODE to limit functions run during d7II
* Added new archive_all_users() function to be run in system_diagnostics
2018-08-18 13:30:07 -07:00
71297eacc8
Allow L_ARGS for Python scripts in Launch.cmd 2018-08-18 13:24:59 -07:00
91b5dbfe88
Added ENABLED_OPEN_LOGS toggle var 2018-08-18 13:22:23 -07:00
143 changed files with 10724 additions and 1321 deletions

View file

@ -1,7 +0,0 @@
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.

BIN
images/ConEmu.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

BIN
images/Linux.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

BIN
images/Syslinux.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

BIN
images/WinPE-Dev.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

View file

@ -1,122 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 4.4 KiB

BIN
images/macOS-10.11.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

BIN
images/macOS-10.13.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 756 KiB

BIN
images/macOS-10.15.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 1.6 MiB

View file

@ -45,6 +45,7 @@ BASE_MENUS = {
MenuEntry('CHKDSK', 'auto_chkdsk'),
MenuEntry('DISM RestoreHealth', 'auto_dism'),
MenuEntry('SFC Scan', 'auto_sfc'),
MenuEntry('Fix File Associations', 'auto_fix_file_associations'),
MenuEntry('Clear Proxy Settings', 'auto_reset_proxy'),
MenuEntry('Disable Pending Renames', 'auto_disable_pending_renames'),
MenuEntry('Registry Repairs', 'auto_repair_registry'),
@ -52,15 +53,23 @@ BASE_MENUS = {
MenuEntry('Reset Windows Policies', 'auto_reset_windows_policies'),
),
'Malware Cleanup': (
MenuEntry('Disable Defender Scans', 'auto_disable_defender', selected=False),
MenuEntry('BleachBit', 'auto_bleachbit'),
MenuEntry('HitmanPro', 'auto_hitmanpro'),
MenuEntry('KVRT', 'auto_kvrt'),
MenuEntry('Windows Defender', 'auto_microsoft_defender'),
MenuEntry('EmsisoftCmd', 'auto_emsisoft_cmd_run', selected=False),
MenuEntry(REBOOT_STR, 'auto_reboot', selected=False),
MenuEntry('EmsisoftCmd (Uninstall)', 'auto_emsisoft_cmd_uninstall', selected=False),
MenuEntry('Enable Defender Scans', 'auto_enable_defender', selected=False),
MenuEntry('Windows Defender', 'auto_microsoft_defender', selected=False),
MenuEntry('Remove Custom Power Plan', 'auto_remove_power_plan'),
MenuEntry(REBOOT_STR, 'auto_reboot'),
),
'Manual Steps': (
MenuEntry('Malwarebytes (Install)', 'auto_mbam_install'),
MenuEntry(REBOOT_STR, 'auto_reboot'),
MenuEntry('AdwCleaner', 'auto_adwcleaner'),
MenuEntry('Malwarebytes (Run)', 'auto_mbam_run'),
MenuEntry('Malwarebytes (Uninstall)', 'auto_mbam_uninstall'),
MenuEntry('Bulk Crap Uninstaller', 'auto_bcuninstaller'),
MenuEntry('Enable Windows Updates', 'auto_windows_updates_enable'),
),
@ -81,6 +90,112 @@ BASE_MENUS = {
}
PRESETS = {
'Default': { # Will be expanded at runtime using BASE_MENUS
'Options': (
'Run AVRemover (once)',
'Run RKill',
'Sync Clock',
),
},
'Data Transfer (to a clean Windows install)': {
'Backup Settings': (
'Enable RegBack',
'Enable System Restore',
'Set System Restore Size',
'Reset Power Plans',
'Set Custom Power Plan',
),
'Malware Cleanup': (
'Disable Defender Scans',
'BleachBit',
'HitmanPro',
'KVRT',
'Enable Defender Scans',
'Remove Custom Power Plan',
),
'Manual Steps': (
'Malwarebytes (Install)',
REBOOT_STR,
'AdwCleaner',
'Malwarebytes (Run)',
'Malwarebytes (Uninstall)',
'Enable Windows Updates',
),
'Options': (
'Sync Clock',
),
},
'Full Malware/Virus Cleanup': {
'Backup Settings': (
'Enable RegBack',
'Enable System Restore',
'Set System Restore Size',
'Create System Restore',
'Backup Browsers',
'Backup Power Plans',
'Reset Power Plans',
'Set Custom Power Plan',
'Backup Registry',
),
'Windows Repairs': (
'Disable Windows Updates',
'Reset Windows Updates',
REBOOT_STR,
'CHKDSK',
'DISM RestoreHealth',
'SFC Scan',
'Fix File Associations',
'Clear Proxy Settings',
'Disable Pending Renames',
'Registry Repairs',
'Reset UAC',
'Reset Windows Policies',
),
'Malware Cleanup': (
'Disable Defender Scans',
'BleachBit',
'HitmanPro',
'KVRT',
'EmsisoftCmd',
REBOOT_STR,
'EmsisoftCmd (Uninstall)',
'Enable Defender Scans',
'Windows Defender',
'Remove Custom Power Plan',
),
'Manual Steps': (
'Malwarebytes (Install)',
REBOOT_STR,
'AdwCleaner',
'Malwarebytes (Run)',
'Malwarebytes (Uninstall)',
'Bulk Crap Uninstaller',
'Enable Windows Updates',
),
'Options': (
'Run AVRemover (once)',
'Run RKill',
'Sync Clock',
),
},
'Minimal Repairs': {
'Backup Settings': (
'Enable RegBack',
'Enable System Restore',
'Set System Restore Size',
'Create System Restore',
'Backup Browsers',
'Backup Power Plans',
'Backup Registry',
),
'Windows Repairs': (
'CHKDSK',
'DISM RestoreHealth',
'SFC Scan',
'Fix File Associations',
'Clear Proxy Settings',
'Disable Pending Renames',
'Registry Repairs',
),
'Options': (
'Run RKill',
'Sync Clock',

View file

@ -34,17 +34,24 @@ BASE_MENUS = {
),
'Install Software': (
MenuEntry('Winget', 'auto_install_winget'),
MenuEntry('ESET NOD32 AV', 'auto_install_eset_nod32_av', selected=False),
MenuEntry('ESET NOD32 AV (MSP)', 'auto_install_eset_nod32_av_msp', selected=False),
MenuEntry('Firefox', 'auto_install_firefox'),
MenuEntry('LibreOffice', 'auto_install_libreoffice', selected=False),
MenuEntry('Open Shell', 'auto_install_open_shell'),
MenuEntry('Open-Shell', 'auto_install_open_shell', selected=False),
MenuEntry('Software Bundle', 'auto_install_software_bundle'),
MenuEntry('Software Upgrades', 'auto_install_software_upgrades'),
MenuEntry('Software Upgrades', 'auto_install_software_upgrades', selected=False),
MenuEntry('Visual C++ Runtimes', 'auto_install_vcredists'),
),
'Configure System': (
MenuEntry('Open Shell', 'auto_config_open_shell'),
MenuEntry('Apply ITS Settings', 'auto_apply_its_settings', selected=False),
MenuEntry('Open-Shell', 'auto_config_open_shell', selected=False),
MenuEntry('Disable Chrome Notifications', 'auto_disable_chrome_notifications', selected=False),
MenuEntry('Disable Fast Startup', 'auto_disable_fast_startup', selected=False),
MenuEntry('Disable Password Expiration', 'auto_disable_password_expiration'),
MenuEntry('Disable Telemetry', 'auto_shutup_10'),
MenuEntry('Enable BSoD MiniDumps', 'auto_enable_bsod_minidumps'),
MenuEntry('Enable Hibernation', 'auto_enable_hibernation', selected=False),
MenuEntry('Enable RegBack', 'auto_enable_regback'),
MenuEntry('Enable System Restore', 'auto_system_restore_enable'),
MenuEntry('Set System Restore Size', 'auto_system_restore_set_size'),
@ -56,7 +63,7 @@ BASE_MENUS = {
MenuEntry('Create System Restore', 'auto_system_restore_create'),
),
'System Information': (
MenuEntry('AIDA64 Report', 'auto_export_aida64_report'),
MenuEntry('AIDA64 Report', 'auto_export_aida64_report', selected=False),
MenuEntry('Backup Registry', 'auto_backup_registry'),
),
'System Summary': (
@ -70,9 +77,9 @@ BASE_MENUS = {
),
'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('Webcam Tests', 'auto_open_mic_and_webcam_tests'),
MenuEntry('Windows Activation', 'auto_open_windows_activation'),
MenuEntry('Windows Updates', 'auto_open_windows_updates'),
MenuEntry('XMPlay', 'auto_open_xmplay'),
@ -89,7 +96,7 @@ PRESETS = {
'Additional User': {
'Configure System': (
'Configure Browsers',
'Open Shell',
'Open-Shell',
'uBlock Origin',
'Enable BSoD MiniDumps',
'Enable RegBack',
@ -136,7 +143,6 @@ PRESETS = {
),
'Run Programs': (
'Device Manager',
'HWiNFO Sensors',
'XMPlay',
),
},

View file

@ -0,0 +1,79 @@
# Export Bitlocker info
# Init
$REPORT = ""
$SKIPPED_PROPERTIES = @(
"CapacityGB",
"MountPoint",
"KeyProtector"
)
# Functions
function Convert-BytesToString ($bytes) {
If ($bytes -gt 1PB) {
return ("{0:0.#} PB" -f ($bytes / 1PB) )
} ElseIf ($bytes -gt 1TB) {
return ("{0:0.#} TB" -f ($bytes / 1TB) )
} ElseIf ($bytes -gt 1GB) {
return ("{0:0.#} GB" -f ($bytes / 1GB) )
} ElseIf ($bytes -gt 1MB) {
return ("{0:0.#} MB" -f ($bytes / 1MB) )
} ElseIf ($bytes -gt 1KB) {
return ("{0:0.#} KB" -f ($bytes / 1KB) )
} Else {
return ("{0} B" -f $bytes)
}
}
# Build report
$system_drive = $env:SystemDrive
if ($system_drive -eq "X:") {
# Assuming we're running in WinPE
$system_drive = "C:"
}
Get-BitlockerVolume -MountPoint $system_drive | ForEach-Object {
$bitlocker_volume = $_
$REPORT += ("`n`nDrive {0}`n---`n" -f $bitlocker_volume.MountPoint)
# Size info
$volume = Get-Volume -DriveLetter $bitlocker_volume.MountPoint[0]
$total = Convert-BytesToString ($volume.Size)
$used = Convert-BytesToString ($volume.Size - $volume.SizeRemaining)
if ($volume.Size -gt 0) {
$REPORT += ("Size: {0} ({1} used)`n" -f $total, $used)
} else {
$REPORT += "Size: Unknown`n"
}
# Volume info
$bitlocker_volume |
Get-Member -MemberType Property |
Where-Object {! $SKIPPED_PROPERTIES.Contains($_.Name)} |
ForEach-Object {
$name = $_.Name
if ($bitlocker_volume.$name -ne $null) {
$REPORT += ("{0}: {1}`n" -f $name, $bitlocker_volume.$name)
}
}
# Key info
$bitlocker_volume.KeyProtector |
ForEach-Object {
$key = $_
$REPORT += "Key Slot:`n"
$key |
Get-Member -MemberType Property |
ForEach-Object {
$name = $_.Name
if ($key.$name -ne $null -and $key.$name -ne "") {
$REPORT += ("... {0}: {1}`n" -f $name, $key.$name)
}
}
}
}
# Show report
Write-Host $REPORT.Trim()
# vim: sts=2 sw=2 ts=2

4
scripts/hw-info-helper Executable file
View file

@ -0,0 +1,4 @@
#!/bin/zsh
#
sudo hw-info | less -S --use-color

View file

@ -56,6 +56,7 @@ for %%f in (%*) do (
if defined _backups mkdir "%client_dir%\Backups">nul 2>&1
if defined _logs (
mkdir "%log_dir%\%KIT_NAME_FULL%">nul 2>&1
mkdir "%log_dir%\d7II">nul 2>&1
mkdir "%log_dir%\Tools">nul 2>&1)
if defined _office mkdir "%client_dir%\Office">nul 2>&1
if defined _quarantine mkdir "%client_dir%\Quarantine">nul 2>&1

View file

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

View file

@ -0,0 +1,9 @@
"""WizardKit: Launch Stress Tests Tool"""
# vim: sts=2 sw=2 ts=2
import wk
wk.kit.tools.run_tool('CoreTemp', 'CoreTemp', popen=True)
wk.kit.tools.run_tool('FurMark2', 'FurMark_GUI', popen=True)
wk.kit.tools.run_tool('Prime95', 'prime95', popen=True)
wk.kit.tools.run_tool('RUST', 'RUST', popen=True)

View file

@ -0,0 +1,9 @@
"""WizardKit: Launch Stress Tests Tool"""
# vim: sts=2 sw=2 ts=2
import wk
wk.kit.tools.run_tool('CoreTemp', 'CoreTemp', popen=True)
wk.kit.tools.run_tool('FurMark', 'FurMark', popen=True)
wk.kit.tools.run_tool('Prime95', 'prime95', popen=True)
wk.kit.tools.run_tool('RUST', 'RUST', popen=True)

View file

@ -11,9 +11,13 @@
"wk/ui/__init__.py" = ["F401"]
# Long lines
"wk/borrowed/acpi.py" = ["E501", "F841"]
"auto_setup.py" = ["E501"]
"wk/cfg/ddrescue.py" = ["E501"]
"wk/cfg/hw.py" = ["E501"]
"wk/cfg/launchers.py" = ["E501"]
"wk/cfg/setup.py" = ["E501"]
"wk/cfg/sources.py" = ["E501"]
# Misc
"set_lp8550_slope.py" = ["E501", "E741"]
"wk/borrowed/acpi.py" = ["E501", "F841"]

103
scripts/set_lp8550_slope.py Executable file
View file

@ -0,0 +1,103 @@
#!/usr/bin/env python3
###
# Dependencies: Linux, python3, python3-smbus
# Usage: `sudo ./set_lp8550_slope.py`
#
# Default slope is 0b101=200ms, can be adjusted below
# Tested with Ubuntu 20.04 on A1466 2013
# All original EEPROM registers value:
# - A0: 0b01111111
# - A1: 0b10110101
# - A2: 0b10111111
# - A3: 0b01111011
# - A4: 0b00101000
# - A5: 0b11001111
# - A6: 0b01100100
# - A7: 0b00101101
###
import time
import smbus2
config = {
'smbus_address': 0, # SMBus address, can use `i2cdetect -l` to find it
'device_address': 0x2C, # LP8550 7 bits address
'slope': (1, 0, 1) # The new slope to set, MSB first, see lp8550 datasheet 8.6.2.3 SLOPE
}
lp8550_regs = {
'EEPROMControl': 0x72,
'EEPROMAddress1': 0xA1 # default value for this register is 0b10110101 on original 820-3437
}
def bitstolist(val, regsize=8):
return [(val >> i) & 0b1 for i in range(0, regsize)]
def listtobits(l, regsize=8):
val = 0
for i in range(0, regsize):
val += l[i] << i
return val
def read_reg(bus, dev_address, reg_name):
return bitstolist(bus.read_byte_data(dev_address, lp8550_regs[reg_name]))
def write_reg(bus, dev_address, reg_name, reg):
print(f'Writing { listtobits(reg)} to {dev_address}, {lp8550_regs[reg_name]}')
bus.write_byte_data(dev_address, lp8550_regs[reg_name], listtobits(reg))
def get_slope(bus, dev_address):
return read_reg(bus, dev_address, 'EEPROMAddress1')[0:3][::-1]
def set_slope(bus, dev_address, slope):
print('Original slope: ', get_slope(bus, dev_address))
EEPROMAddress1 = read_reg(bus, dev_address, 'EEPROMAddress1')
EEPROMAddress1[0:3] = slope[::-1]
write_reg(bus, dev_address, 'EEPROMAddress1', EEPROMAddress1)
print('New slope: ', get_slope(bus, dev_address))
def write_nvm(bus, dev_address):
print('Writing to non-volatile memory')
EEPROMControl = [0]*8
EEPROMControl[2] = 1 # EE_INIT=1
write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl)
EEPROMControl[1] = 1 # EE_PROG=1
EEPROMControl[2] = 0 # EE_INIT=0
write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl)
time.sleep(0.2) # wait 200ms
EEPROMControl[1] = 0 # EE_PROG=0
write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl)
def load_nvm(bus, dev_address):
print('Loading from non-volatile memory')
EEPROMControl = [0]*8
EEPROMControl[2] = 1 # EE_INIT=1
write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl)
EEPROMControl[0] = 1 # EE_READ=1
EEPROMControl[2] = 0 # EE_INIT=0
write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl)
time.sleep(0.2) # wait 200ms
EEPROMControl[0] = 0 # EE_READ=0
write_reg(bus, dev_address, 'EEPROMControl', EEPROMControl)
def main():
bus = smbus2.SMBus(config['smbus_address'])
set_slope(bus, config['device_address'], config['slope'])
write_nvm(bus, config['device_address'])
load_nvm(bus, config['device_address'])
print('Slope in non-volatile memory: ', get_slope(bus,config['device_address']))
if __name__ == "__main__":
main()

View file

@ -25,6 +25,53 @@ if PLATFORM not in ('macOS', 'Linux'):
# Functions
def compress(reason):
dest = pathlib.Path(f'~/{reason}_{NOW.strftime("%Y-%m-%dT%H%M%S%z")}.txz')
dest = dest.expanduser().resolve()
cmd = ['tar', 'caf', dest.name, LOG_DIR.name]
wk.exe.run_program(cmd, check=False)
return dest
def compress_live_macos(reason):
"""Compress log_dir using the RAM disk."""
dest = pathlib.Path(
f'/Volumes/RAM_Disk/{reason}_{NOW.strftime("%Y-%m-%dT%H%M%S%z")}.txz',
)
tmp_file = dest.with_suffix('.tar')
cmd = ['tar', '-cf', tmp_file.name, LOG_DIR.name]
wk.exe.run_program(cmd, check=False)
cmd = ['xz', '-z', tmp_file.name]
wk.exe.run_program(cmd, check=False)
tmp_file = tmp_file.with_suffix('.tar.xz')
tmp_file.rename(dest.name)
return dest
def compress_and_upload(reason='Testing'):
"""Upload compressed log_dir to the crash server."""
server = wk.cfg.net.CRASH_SERVER
upload_args = {
'headers': server['Headers'],
'auth': (server['User'], server['Pass']),
}
# Compress LOG_DIR (relative to parent dir)
if os.path.exists('/.wk-live-macos'):
dest = compress_live_macos(reason)
else:
dest = compress(reason)
upload_args['data'] = dest.read_bytes()
# Upload compressed data
url = f'{server["Url"]}/{dest.name}'
result = requests.put(url, **upload_args)
# Check result
if not result.ok:
raise wk.std.GenericError('Failed to upload logs')
def main() -> None:
"""Upload logs for review."""
lines = []
@ -42,7 +89,7 @@ def main() -> None:
# Get reason note
while True:
text = wk.ui.cli.input_text('> ')
text = wk.ui.cli.input_text('> ', allow_empty=True)
if not text:
lines.append('')
break
@ -51,9 +98,11 @@ def main() -> None:
_f.write('\n'.join(lines))
# Compress and upload logs
os.chdir(LOG_DIR.parent)
print(os.getcwd())
result = try_and_print.run(
message='Uploading logs...',
function=upload_log_dir,
function=compress_and_upload,
reason='Review',
)
if not result['Failed']:

View file

@ -1,13 +1,13 @@
"""WizardKit: wk module init"""
# vim: sts=2 sw=2 ts=2
import platform
from sys import stderr, version_info
from . import cfg
from . import clone
from . import debug
from . import exe
from . import graph
from . import hw
from . import io
from . import kit
@ -19,6 +19,10 @@ from . import setup
from . import std
from . import ui
if platform.system() != 'Windows':
from wk import graph
from wk import osticket
# Check env
if version_info < (3, 10):

View file

@ -0,0 +1,36 @@
-----BEGIN CERTIFICATE-----
MIIGTzCCBDegAwIBAgIBfDANBgkqhkiG9w0BAQsFADCBsDELMAkGA1UEBhMCVVMx
DzANBgNVBAgTBk9yZWdvbjERMA8GA1UEBxMIUG9ydGxhbmQxHTAbBgNVBAoTFDEy
MDEgQ29tcHV0ZXIgUmVwYWlyMSMwIQYDVQQLExoxMjAxIENlcnRpZmljYXRlIEF1
dGhvcml0eTEVMBMGA1UEAxMMMTIwMSBSb290IENBMSIwIAYJKoZIhvcNAQkBFhNt
YW5hZ2VtZW50QDEyMDEuY29tMB4XDTE4MDgyMDA2MDEwMFoXDTM4MDgyMDA2MDEw
MFowgbAxCzAJBgNVBAYTAlVTMQ8wDQYDVQQIEwZPcmVnb24xETAPBgNVBAcTCFBv
cnRsYW5kMR0wGwYDVQQKExQxMjAxIENvbXB1dGVyIFJlcGFpcjEjMCEGA1UECxMa
MTIwMSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFTATBgNVBAMTDDEyMDEgUm9vdCBD
QTEiMCAGCSqGSIb3DQEJARYTbWFuYWdlbWVudEAxMjAxLmNvbTCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBANGYohJk5/CC/p14R7EpnhdEUF7Wvlnt8yuF
dtuyStlIGkLxPMlj9hQfoLDplQqlKBefTaI3WwrI/Hndso+jStLKgtRWRdyNB34K
AWqT04zXYGicdi3fqaMhEC4SPyX1tRXU2e9kjtIJ21AZx2F40NUjfOMKLVymZgXm
gkG1oA/BSzE8vIidrd/lJPwo0u+EYFa87y+9SHS93Ze1AVoTVqUzSMkjqt+6YIzJ
4XBD7UBvps0Mnd18HMUlXHFXusUL1K921W3wDVcMlNIIA8MJjQk+aVS/1EGSn+81
C+r40x64lYkyh0ZUAHkVXUC/BUfa0SKx1Nfa4mSvtyPnUCb7Dir8MkTDKgopGCok
KmW+VvE2H8AEPCbcctFmhdip19laYxzyDhZ5wiQN6AOg64cWvDf6/uT9hyPvxkj1
ps5vWElryzawTE7h1BI8liMqwsG1Y7cc6D0PABxPsp4iR8pde0oZtpLnEvejRodo
zz3BGvZjq+pHtRMjL+yiDtdAL+K+7/e7gNCQBIGsphahWIOf7TczWVgMNclTNxl3
WZjKkOEs7j+prRTDvffV6H32+Tk5TwgMsfvnY4a37CkJ0L0d1JhWj9wO+gESfg3W
8yvt3hfcj3NOUMJWhJstqlIeX8dj7vVcMhjNvYJxabJmJgk+DNlHe55fXDGJ1CLO
E0EbRTyBAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFM+hXjFx
6BldZFBQW1Pn/Yp3vbw+MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcw
HgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOC
AgEALWcnu3auMSnSSF/kOiLvJ4RAnHZebGYNcUWM14u1K1/XtTB7AFzQIHX7BcDH
m/z4UEyhl9EdR5Bgf2Szuk+8+LyGqcdAdbPoK+bmcwwL8lufDnlIYBThKIBfU2Xw
vw41972B+HH5r1TZXve1EdJaLyImbxmq5s41oH7djGC+sowtyGuVqP7RBguXBGiJ
At1yfdPWVaxLmE8QFknkIvpgTmELpxasTfvgnQBenA3Ts0Z2hwN4796hLbRzGsb8
4hKWAfQDP0klzXKRRyVeAueXxj/FcNZilYxv15MqMc4qrUiW0hXHluQM1yceNjNZ
SE4Igi1Ap71L4PpgkHIDfZD908UexGGkql+p4EWrpnXUYWTa0sHg1bFKQntgpyFg
86Ug0Q7ZNhImENzeigZknL0ceIdaNUCs7UPrkqpUSJR2yujp1JC3tX1LgKZw8B3J
fQx/8h3zzNuz5dVtr1wUJaUD0nGhMIRBEXb2t4jupEISSTN1pkHPcbNzhAQXjVUA
CJxnnz3jmyGsNCoQf7NWfaN6RSRTWehsC6m7JvPvoU2EZoQkSlNOv4xZuFpEx0u7
MFDtC1cSGPH7YwYXPVc45xAMC6Ni8mvq93oT89XZNHIqE8/T8aPHLwYFgu1b1r/A
L8oMEnG5s8tG3n0DcFoOYsaIzVeP0r7B7e3zKui6DQLuu9E=
-----END CERTIFICATE-----

View file

@ -5,7 +5,6 @@ from . import hw
from . import launchers
from . import log
from . import main
from . import music
from . import net
from . import repairs
from . import setup

View file

@ -6,6 +6,7 @@
TMUX_SIDE_WIDTH = 21
TMUX_LAYOUT = {
'Source': {'height': 2, 'Check': True},
'Ticket': {'height': 2, 'Check': True},
'Started': {'width': TMUX_SIDE_WIDTH, 'Check': True},
'Progress': {'width': TMUX_SIDE_WIDTH, 'Check': True},
}

View file

@ -14,11 +14,14 @@ ATTRIBUTE_COLORS = (
# NOTE: Force 4K read block size for disks >= 3TB
BADBLOCKS_EXTRA_LARGE_DISK = 15 * 1024**4
BADBLOCKS_LARGE_DISK = 3 * 1024**4
BADBLOCKS_MAX_ERRORS = 1
BADBLOCKS_REGEX = re.compile(
r'^Pass completed, (\d+) bad blocks found. .(\d+)/(\d+)/(\d+) errors',
re.IGNORECASE,
)
BADBLOCKS_RESULTS_REGEX = re.compile(r'^(.*?)\x08.*\x08(.*)')
BADBLOCKS_RESULTS_REGEX = re.compile(
r'^(Checking for bad blocks .read-only test.: ).*\x08+(done|\s+).*?(\x08+)?'
)
BADBLOCKS_SKIP_REGEX = re.compile(r'^(Checking|\[)', re.IGNORECASE)
CPU_TEMPS = {
'Cooling Delta': 25,
@ -36,6 +39,7 @@ IO_MINIMUM_TEST_SIZE = 10 * 1024**3
IO_RATE_REGEX = re.compile(
r'(?P<bytes>\d+) bytes.* (?P<seconds>\S+) s(?:,|ecs )',
)
IO_SMALL_DISK = 450 * 1000**3
KEY_NVME = 'nvme_smart_health_information_log'
KEY_SMART = 'ata_smart_attributes'
KNOWN_DISK_ATTRIBUTES = {
@ -82,9 +86,18 @@ NVME_WARNING_KEYS = (
'reliability_degraded',
'volatile_memory_backup_failed',
)
REGEX_BLOCK_GRAPH = re.compile(r'(▁|▂|▃|▄|▅|▆|▇|█)')
REGEX_POWER_ON_TIME = re.compile(
r'^(\d+)([Hh].*|\s+\(\d+\s+\d+\s+\d+\).*)'
)
REGEX_SMART_ATTRIBUTES = re.compile(
r'^\s*(?P<decimal>\d+) / (?P<hex>\w\w): (?P<data>.*)$',
)
REGEX_VOLUME = re.compile(
r'^(?P<dev>.*?) '
r'(?P<result>(APFS|CoreStorage) container|Failed to mount|Mounted on|\S+$)'
r'($| (?P<path>.*) \((?P<details>.*)\))'
)
SMART_SELF_TEST_START_TIMEOUT_IN_SECONDS = 120
SMC_IDS = {
# Sources: https://github.com/beltex/SMCKit/blob/master/SMCKit/SMC.swift
@ -134,15 +147,16 @@ SMC_IDS = {
'TS0C': {'CPU Temp': False, 'Source': 'CPU B DIMM Exit Ambient'},
}
STATUS_COLORS = {
'Passed': 'GREEN',
'Aborted': 'YELLOW',
'N/A': 'YELLOW',
'Skipped': 'YELLOW',
'Unknown': 'YELLOW',
'Working': 'YELLOW',
'Denied': 'RED',
'ERROR': 'RED',
'Failed': 'RED',
'Done': 'CYAN',
'Passed': 'GREEN',
'Aborted': 'YELLOW',
'N/A': 'YELLOW',
'Skipped': 'YELLOW',
'Unknown': 'YELLOW',
'Working': 'YELLOW',
'Denied': 'RED',
'ERROR': 'RED',
'Failed': 'RED',
'TimedOut': 'RED',
}
TEMP_COLORS = {
@ -165,8 +179,9 @@ THRESH_SSD_MIN = 90 * 1024**2
THRESH_SSD_AVG_HIGH = 135 * 1024**2
THRESH_SSD_AVG_LOW = 100 * 1024**2
# VOLUME THRESHOLDS in percent
VOLUME_WARNING_THRESHOLD = 70
VOLUME_FAILURE_THRESHOLD = 85
VOLUME_WARNING_THRESHOLD = 70
VOLUME_FAILURE_THRESHOLD = 85
VOLUME_SIZE_THRESHOLD = 30 # In GB
if __name__ == '__main__':

View file

@ -133,6 +133,15 @@ LAUNCHERS = {
'L_ARGS': '-nodb',
'L_ELEV': 'True',
},
"Fab's Autobackup Pro": {
'L_TYPE': 'Executable',
'L_PATH': 'AutoBackupPro',
'L_ITEM': 'autobackup6pro.exe',
'Extra Code': [
r'call "%bin%\Scripts\init_client_dir.cmd"',
r'reg add HKCU\Software\1201-WizardKit /v FabLastRun /t REG_SZ /d %iso_date% /f >nul 2>&1',
],
},
'FastCopy (as ADMIN)': {
'L_TYPE': 'Executable',
'L_PATH': 'FastCopy',
@ -233,40 +242,76 @@ LAUNCHERS = {
'L_PATH': 'FurMark',
'L_ITEM': 'FurMark.exe',
},
'HWiNFO': {
'L_TYPE': 'Executable',
'L_PATH': 'HWiNFO',
'L_ITEM': 'HWiNFO.exe',
'Extra Code': [
r'for %%a in (32 64) do (',
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r')',
],
},
'HWiNFO (Sensors)': {
'L_TYPE': 'Executable',
'L_PATH': 'HWiNFO',
'L_ITEM': 'HWiNFO.exe',
'Extra Code': [
r'for %%a in (32 64) do (',
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SensorsOnly=1)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
r')',
],
},
'Notepad++': {
'L_TYPE': 'Executable',
'L_PATH': 'notepadplusplus',
'L_ITEM': 'notepadplusplus.exe',
},
'Prime95': {
'L_TYPE': 'Executable',
'L_PATH': 'Prime95',
'L_ITEM': 'prime95.exe',
},
'PuTTY': {
'L_TYPE': 'Executable',
'L_PATH': 'PuTTY',
'L_ITEM': 'PUTTY.EXE',
},
'ShutUp10': {
'L_TYPE': 'Executable',
'L_PATH': 'ShutUp10',
'L_ITEM': 'OOSU10.exe',
},
'ShutUp10 (1201 Minimal Selection)': {
'L_TYPE': 'Executable',
'L_PATH': 'ShutUp10',
'L_ITEM': 'OOSU10.exe',
'L_ARGS': '1201.cfg',
},
'Stress Tests (Classic)': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'launch_stress_tests_classic.py',
'L_ELEV': 'True',
},
'Stress Tests': {
'L_TYPE': 'PyScript',
'L_PATH': 'Scripts',
'L_ITEM': 'launch_stress_tests.py',
'L_ELEV': 'True',
},
'Windows Repair AIO': {
'L_TYPE': 'Executable',
'L_PATH': 'WinRepairAIO',
'L_ITEM': 'Repair_Windows.exe',
'L_ELEV': 'True',
'Extra Code': [
r'copy /y "%bin%\WinRepairAIO\__empty.ini" "%bin%\WinRepairAIO\settings.ini"',
],
},
'Windows Repair AIO (Fix Associations)': {
'L_TYPE': 'Executable',
'L_PATH': 'WinRepairAIO',
'L_ITEM': 'Repair_Windows.exe',
'L_ELEV': 'True',
'Extra Code': [
r'copy /y "%bin%\WinRepairAIO\__associations.ini" "%bin%\WinRepairAIO\settings.ini"',
],
},
'Windows Repair AIO (Fix Permissions)': {
'L_TYPE': 'Executable',
'L_PATH': 'WinRepairAIO',
'L_ITEM': 'Repair_Windows.exe',
'L_ELEV': 'True',
'Extra Code': [
r'copy /y "%bin%\WinRepairAIO\__permissions.ini" "%bin%\WinRepairAIO\settings.ini"',
],
},
'WinSCP': {
'L_TYPE': 'Executable',
'L_PATH': 'WinSCP',
'L_ITEM': 'WinSCP.exe',
},
'WizTree': {
'L_TYPE': 'Executable',
'L_PATH': 'WizTree',
@ -277,7 +322,7 @@ LAUNCHERS = {
'L_TYPE': 'Executable',
'L_PATH': 'XMPlay',
'L_ITEM': 'xmplay.exe',
'L_ARGS': r'"%bin%\XMPlay\music.7z"',
'L_ARGS': r'"%bin%\XMPlay\music.m3u"',
},
},
}

View file

@ -8,21 +8,21 @@ NOTE: Non-standard formating is used for BASH/BATCH/PYTHON compatibility
# Features
ENABLED_OPEN_LOGS=False
ENABLED_TICKET_NUMBERS=False
ENABLED_UPLOAD_DATA=False
ENABLED_UPLOAD_DATA=True
# Main Kit
ARCHIVE_PASSWORD='Abracadabra'
KIT_NAME_FULL='WizardKit'
KIT_NAME_SHORT='WK'
SUPPORT_MESSAGE='Please let 2Shirt know by opening an issue on Gitea'
ARCHIVE_PASSWORD='Sorted1201'
KIT_NAME_FULL='1201-WizardKit'
KIT_NAME_SHORT='1201'
SUPPORT_MESSAGE='Please let support know by opening an issue on Gitea'
# Text Formatting
INDENT=4
WIDTH=32
# Live Linux
ROOT_PASSWORD='Abracadabra'
TECH_PASSWORD='Abracadabra'
ROOT_PASSWORD='1201 loves computers!'
TECH_PASSWORD='Sorted1201'
# Time Zones
## See 'timedatectl list-timezones' for valid Linux values

View file

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

View file

@ -4,38 +4,41 @@
# Servers
BACKUP_SERVERS = {
#'Server One': {
# 'Address': '10.0.0.10',
# 'Share': 'Backups',
# 'RO-User': 'restore',
# 'RO-Pass': 'Abracadabra',
# 'RW-User': 'backup',
# 'RW-Pass': 'Abracadabra',
# },
#'Server Two': {
# 'Address': 'servertwo.example.com',
# 'Share': 'Backups',
# 'RO-User': 'restore',
# 'RO-Pass': 'Abracadabra',
# 'RW-User': 'backup',
# 'RW-Pass': 'Abracadabra',
# },
'Anaconda': {
'Address': 'anaconda.1201.com',
'Share': 'Backups',
'RO-User': 'cx',
'RO-Pass': 'cx',
'RW-User': 'backup',
'RW-Pass': '1201 loves computers!',
},
}
BENCHMARK_SERVER = {
'Name': 'Nextcloud',
'Short Url': 'https://1201.ddns.net/nextcloud/f/14775',
'Url': 'https://1201.ddns.net/nextcloud/public.php/webdav/Benchmarks',
'User': 'LHdPTofNBQNGBbX',
'Pass': '',
}
CRASH_SERVER = {
#'Name': 'CrashServer',
#'Url': '',
#'User': '',
#'Pass': '',
#'Headers': {'X-Requested-With': 'XMLHttpRequest'},
'Name': 'Nextcloud',
'Url': 'https://1201.ddns.net/nextcloud/public.php/webdav/Issues',
'User': 'fnyzeK64rKxcEL4',
'Pass': '',
'Headers': {'X-Requested-With': 'XMLHttpRequest'},
}
SDIO_SERVER = {
'Address': '',
'Share': '',
'Path': '',
'RO-User': '',
'RO-Pass': '',
'Address': 'anaconda.1201.com',
'Share': 'Snappy',
'Path': '\\',
'RO-User': 'cx',
'RO-Pass': 'cx',
}
# Misc
IMGUR_CLIENT_ID='3d1ee1d38707b85'
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -0,0 +1,17 @@
"""Wizard Kit: Config - osTicket"""
# vim: sts=2 sw=2 ts=2
SQL = {
'DB': 'osticket',
'Host': 'osticket.1201.com',
'Port': 3306,
'User': 'wizardkit',
'Pass': 'U9bJnF9eamVkfsVw',
}
STAFF = {
'ID': '23',
'Name': 'Wizard Kit',
}
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -1,7 +1,7 @@
"""WizardKit: Config - Repairs"""
# vim: sts=2 sw=2 ts=2
from wk.cfg.main import KIT_NAME_FULL
from wk.cfg.main import KIT_NAME_FULL, KIT_NAME_SHORT
AUTO_REPAIR_DELAY_IN_SECONDS = 3
AUTO_REPAIR_KEY = fr'Software\{KIT_NAME_FULL}\Auto Repairs'
@ -59,7 +59,7 @@ BLEACH_BIT_CLEANERS = (
'windows_explorer.run',
'windows_explorer.thumbnails',
)
CUSTOM_POWER_PLAN_NAME = f'{KIT_NAME_FULL} Power Plan'
CUSTOM_POWER_PLAN_NAME = f'{KIT_NAME_SHORT} Power Plan'
CUSTOM_POWER_PLAN_DESC = 'Customized for the best experience.'
POWER_PLANS = {
'Balanced': '381b4222-f694-41f0-9685-ff5bb260df2e',

View file

@ -9,10 +9,9 @@ BROWSER_PATHS = {
'Microsoft Edge': 'Microsoft/Edge/Application/msedge.exe',
'Opera': 'Opera/launcher.exe',
}
FAB_TIMEFRAME = 14 # If it's been at least this many days don't prompt for an AV scan
DISABLED_ENTRIES_WINDOWS_11 = {
# Group Name: Option Name
'Install Software': 'Open Shell',
'Configure System': 'Open Shell',
}
LIBREOFFICE_XCU_DATA = '''<?xml version="1.0" encoding="UTF-8"?>
<oor:items xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
@ -29,6 +28,21 @@ REG_CHROME_UBLOCK_ORIGIN = {
)
},
}
REG_ESET_NOD32_SETTINGS = {
'HKCU': {
r'Software\ESET\ESET Security\CurrentVersion\gui\UI_CONFIG': (
('FullScreenMode', 0, 'DWORD'),
('ShowAlertStatus', 0x40000000, 'DWORD'),
('ShowDesktopAlert', 0, 'DWORD'),
('ShowSplash', 0, 'DWORD'),
),
},
'HKLM': {
r'Software\ESET\ESET Security\CurrentVersion\Config\Settings\LiveGrid': (
('LiveGridFeedbackEnabled', 1, 'DWORD'),
),
},
}
REG_WINDOWS_EXPLORER = {
'HKLM': {
# Allow password sign-in for MS accounts
@ -50,6 +64,12 @@ REG_WINDOWS_EXPLORER = {
r'Software\Policies\Microsoft\Windows\DataCollection': (
('AllowTelemetry', 0, 'DWORD'),
),
# Disable Timeline
r'Software\Policies\Microsoft\Windows\System': (
('EnableActivityFeed', 0, 'DWORD'),
('PublishUserActivities', 0, 'DWORD'),
('UploadUserActivities', 0, 'DWORD'),
),
# Disable floating Bing search widget
r'Software\Policies\Microsoft\Edge': (
('WebWidgetAllowed', 0, 'DWORD'),
@ -85,6 +105,7 @@ REG_WINDOWS_EXPLORER = {
),
# Disable search highlights
r'Software\Microsoft\Windows\CurrentVersion\Feeds\DSB': (
('OpenOnHover', 0, 'DWORD'),
('ShowDynamicContent', 0, 'DWORD'),
),
# File Explorer
@ -99,7 +120,7 @@ REG_WINDOWS_EXPLORER = {
),
# Hide Search button / box
r'Software\Microsoft\Windows\CurrentVersion\Search': (
('SearchboxTaskbarMode', 1, 'DWORD'),
('SearchboxTaskbarMode', 2, 'DWORD'),
),
# Disable search highlights from opening on hover
r'Software\Microsoft\Windows\CurrentVersion\SearchSettings': (

View file

@ -9,46 +9,45 @@ DOWNLOAD_FREQUENCY = 7
# Sources
SOURCES = {
# Main
'AVRemover32': 'https://download.eset.com/com/eset/tools/installers/av_remover/latest/avremover_nt32_enu.exe',
'AVRemover64': 'https://download.eset.com/com/eset/tools/installers/av_remover/latest/avremover_nt64_enu.exe',
'AdwCleaner': 'https://downloads.malwarebytes.com/file/adwcleaner',
'Autologon32': 'http://live.sysinternals.com/Autologon.exe',
'AdwCleaner': 'https://adwcleaner.malwarebytes.com/adwcleaner?channel=release',
'Autologon64': 'http://live.sysinternals.com/Autologon64.exe',
'Firefox32': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win&lang=en-US',
'CoreTemp64': 'https://www.alcpu.com/CoreTemp/CoreTemp64.zip',
'ESET_NOD32_AV64': 'https://download.eset.com/com/eset/apps/home/eav/windows/latest/eav_nt64.exe',
'EmsisoftCmd64': 'https://dl.emsisoft.com/EmsisoftCommandlineScanner64.exe',
'Firefox64': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US',
'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe',
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
'KVRT': 'https://devbuilds.s.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe',
'MBAM': 'https://downloads.malwarebytes.com/file/mb-windows',
'RKill': 'https://download.bleepingcomputer.com/grinler/rkill.exe',
'RegDelNull': 'https://live.sysinternals.com/RegDelNull.exe',
'RegDelNull64': 'https://live.sysinternals.com/RegDelNull64.exe',
# Build Kit
'AIDA64': 'https://download.aida64.com/aida64engineer692.zip',
'Adobe Reader DC': 'https://ardownload2.adobe.com/pub/adobe/reader/win/AcrobatDC/2300620360/AcroRdrDC2300620360_en_US.exe',
'AIDA64': 'https://download.aida64.com/aida64engineer720.zip',
'Adobe Reader DC': 'https://ardownload2.adobe.com/pub/adobe/acrobat/win/AcrobatDC/2400120615/AcroRdrDCx642400120615_en_US.exe',
'Aria2': 'https://github.com/aria2/aria2/releases/download/release-1.36.0/aria2-1.36.0-win-32bit-build1.zip',
'Autoruns32': 'http://live.sysinternals.com/Autoruns.exe',
'Autoruns64': 'http://live.sysinternals.com/Autoruns64.exe',
'BleachBit': 'https://download.bleachbit.org/BleachBit-4.4.2-portable.zip',
'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip',
'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip',
'BCUninstaller': 'https://github.com/Klocman/Bulk-Crap-Uninstaller/releases/download/v5.7/BCUninstaller_5.7_portable.zip',
'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip',
'DDU': 'https://www.wagnardsoft.com/DDU/download/DDU%20v18.0.6.8.exe',
'ERUNT': 'http://www.aumha.org/downloads/erunt.zip',
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.1024.x86.zip',
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.1024.x64.zip',
'FastCopy': 'https://github.com/FastCopyLab/FastCopyDist2/raw/main/FastCopy5.4.2_installer.exe',
'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.3/Fluent-Metro_1.5.3.zip',
'FurMark': 'https://geeks3d.com/dl/get/728',
'HWiNFO': 'https://www.sac.sk/download/utildiag/hwi_764.zip',
'LibreOffice32': 'https://download.documentfoundation.org/libreoffice/stable/7.6.2/win/x86/LibreOffice_7.6.2_Win_x86.msi',
'LibreOffice64': 'https://download.documentfoundation.org/libreoffice/stable/7.6.2/win/x86_64/LibreOffice_7.6.2_Win_x86-64.msi',
'LibreOffice64': 'https://download.documentfoundation.org/libreoffice/stable/7.6.6/win/x86_64/LibreOffice_7.6.6_Win_x86-64.msi',
'Linux Reader': 'https://www.diskinternals.com/download/Linux_Reader.exe',
'Macs Fan Control': 'https://www.crystalidea.com/downloads/macsfancontrol_setup.exe',
'Neutron': 'http://keir.net/download/neutron.zip',
'Notepad++': 'https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.5.8/npp.8.5.8.portable.minimalist.7z',
'OpenShell': 'https://github.com/Open-Shell/Open-Shell-Menu/releases/download/v4.4.191/OpenShellSetup_4_4_191.exe',
'Prime95': 'https://www.mersenne.org/download/software/v30/30.19/p95v3019b13.win64.zip',
'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip',
'SDIO Torrent': 'https://www.glenn.delahoy.com/downloads/sdio/SDIO_Update.torrent',
'ShutUp10': 'https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe',
'Windows Repair AIO': 'http://www.tweaking.com/files/setups/tweaking.com_windows_repair_aio.zip',
'WinSCP': 'https://sourceforge.net/projects/winscp/files/WinSCP/5.19.5/WinSCP-5.19.5-Portable.zip/download',
'WizTree': 'https://diskanalyzer.com/files/wiztree_4_15_portable.zip',
'XMPlay': 'https://support.xmplay.com/files/20/xmplay385.zip?v=47090',
'XMPlay 7z': 'https://support.xmplay.com/files/16/xmp-7z.zip?v=800962',

View file

@ -8,6 +8,7 @@ from wk.cfg.main import KIT_NAME_FULL
SOURCES = {
'Linux': {'Arg': '--linux', 'Type': 'ISO'},
'WinPE': {'Arg': '--winpe', 'Type': 'ISO'},
'ESET SysRescue': {'Arg': '--eset', 'Type': 'IMG'},
'Main Kit': {'Arg': '--main-kit', 'Type': 'KIT'},
'Extra Dir': {'Arg': '--extra-dir', 'Type': 'DIR'},
}
@ -15,23 +16,44 @@ SOURCES = {
# Definitions: Boot entries
BOOT_ENTRIES = {
# Path to check: Comment to remove
'/arch_minimal': 'UFD-MINIMAL',
'/casper': 'UFD-ESET',
'/sources/boot.wim': 'UFD-WINPE',
}
BOOT_FILES = {
# Directory: extension
'/syslinux': 'cfg',
'/boot/grub': 'cfg',
'/EFI/boot': 'conf',
}
IMAGE_BOOT_ENTRIES = {
'El Capitan': 'UFD-MACOS-10.11',
'High Sierra': 'UFD-MACOS-10.13',
'Catalina': 'UFD-MACOS-10.15',
'3S132': 'UFD-ASD-3S132',
'3S138': 'UFD-ASD-3S138',
'3S140': 'UFD-ASD-3S140',
'3S142A': 'UFD-ASD-3S142A',
'3S144': 'UFD-ASD-3S144',
'3S145A': 'UFD-ASD-3S145A',
'3S146': 'UFD-ASD-3S146',
'3S147': 'UFD-ASD-3S147',
'3S148': 'UFD-ASD-3S148',
'3S150': 'UFD-ASD-3S150',
'3S155': 'UFD-ASD-3S155',
'3S156': 'UFD-ASD-3S156',
'3S162': 'UFD-ASD-3S162',
}
# Definitions: Sources and Destinations
## NOTES: Paths are relative to the root of the ISO/UFD
## Sources use rsync's trailing slash syntax
ITEMS = {
'ESET SysRescue': (
('/boot/grub/', '/boot/grub/'),
('/casper/', '/casper/'),
('/EFI/boot/', '/EFI/ESET/'),
),
'Extra Dir': (
('/', '/'),
),
@ -42,15 +64,14 @@ ITEMS = {
('/', f'/{KIT_NAME_FULL}/'),
),
'WinPE': (
('/bootmgr', '/'),
('/BOOTMGR', '/'),
('/bootmgr.efi', '/'),
('/en_us', '/'),
('/Boot/', '/boot/'),
('/EFI/Boot/', '/EFI/Microsoft/'),
('/EFI/Microsoft/', '/EFI/Microsoft/'),
('/Boot/BCD', '/sources/'),
('/Boot/boot.sdi', '/sources/'),
('/bootmgr', '/sources/'),
('/boot/', '/boot/'),
('/efi/boot/', '/EFI/Microsoft/'),
('/efi/microsoft/', '/EFI/Microsoft/'),
('/boot/bcd', '/sources/'),
('/boot/boot.sdi', '/sources/'),
('/BOOTMGR', '/sources/'),
('/sources/boot.wim', '/sources/'),
),
}
@ -74,6 +95,8 @@ ITEMS_FROM_LIVE = {
),
}
ITEMS_HIDDEN = (
# ESET
'casper',
# Linux (all versions)
'arch',
'EFI',
@ -83,9 +106,8 @@ ITEMS_HIDDEN = (
f'{KIT_NAME_FULL}/.cbin',
# WinPE
'boot',
'bootmgr',
'BOOTMGR',
'bootmgr.efi',
'en-us',
'images',
'sources',
)

View file

@ -41,6 +41,7 @@ class BlockPair():
self.map_data: dict[str, bool | int] = {}
self.map_path: pathlib.Path = pathlib.Path()
self.size: int = source_dev.size
self.stats = {}
self.status: dict[str, float | int | str] = {
'read-skip': 'Pending',
'read-full': 'Pending',
@ -190,6 +191,25 @@ class BlockPair():
# This should never be reached
return False
def reset_progress(self):
"""Reset progress to start fresh recovery."""
self.map_data = {}
self.status = {
'read': 'Pending',
'trim': 'Pending',
'scrape': 'Pending',
}
self.map_path.write_text(
data=cfg.ddrescue.DDRESCUE_MAP_TEMPLATE.format(
name=cfg.main.KIT_NAME_FULL,
size=self.size,
),
encoding='utf-8',
)
# Set initial status
self.set_initial_status()
def safety_check(self) -> None:
"""Run safety check and abort if necessary."""
# TODO: Expand section to support non-Linux systems
@ -249,6 +269,7 @@ def add_clone_block_pairs(state) -> list[hw_disk.Disk]:
source_sep = get_partition_separator(state.source.path.name)
dest_sep = get_partition_separator(state.destination.path.name)
settings = {}
source_parts = []
# Clone settings
settings = state.load_settings(discard_unused_settings=True)

View file

@ -8,6 +8,7 @@ import os
import pathlib
import subprocess
from typing import Any
from random import randint
import pytz
@ -24,7 +25,7 @@ from wk.hw.smart import (
smart_status_ok,
update_smart_details,
)
from wk.ui import ansi, cli
from wk.ui import ansi, cli, tmux
# STATIC VARIABLES
@ -129,13 +130,25 @@ def check_destination_health(destination) -> str:
result = 'Critical error(s) detected for: {destination.path}'
# Check for minor errors
if not check_attributes(destination, only_blocking=False):
if not check_attributes(destination, only_blocking=True):
result = f'Attribute error(s) detected for: {destination.path}'
# Done
return result
def detect_drives(state):
"""Detect connected drives and check source/dest selections."""
cli.clear_screen()
cli.print_warning(DETECT_DRIVES_NOTICE)
if cli.ask('Are you sure you proceed?'):
cli.print_standard('Forcing controllers to rescan for devices...')
cmd = 'echo "- - -" | sudo tee /sys/class/scsi_host/host*/scan'
exe.run_program(cmd, check=False, shell=True)
if source_or_destination_changed(state):
cli.abort()
def generate_test_map(map_path: pathlib.Path, size: int) -> None:
"""Generate test map with roughly 20% of the space marked as bad."""
chunk = 2*1024**2
@ -176,9 +189,28 @@ def get_ddrescue_settings(settings_menu) -> list:
return settings
def get_stats(output: str | None = None) -> dict[str, Any]:
"""Get stats from ddrescue output, returns dict."""
output = tmux.capture_pane()
stats = {}
temp = []
for line in output[output.find('ipos:'):].splitlines():
temp.extend(line.split(','))
for line in temp:
line = line.strip()
try:
key, value = line.split(':')
stats[key] = value.strip()
except ValueError:
# ignore
pass
return stats
def finalize_recovery(state: State, dry_run: bool = True) -> None:
"""Show recovery finalization options and run selected functions."""
options = (
'Post results to osTicket',
'Relocate Backup GPT',
'Zero-fill Gaps',
'Zero-fill Extra Space',
@ -221,6 +253,9 @@ def finalize_recovery(state: State, dry_run: bool = True) -> None:
if state.mode == 'Image':
details['Disabled'] = True
details['Selected'] = False
if 'osTicket' in name:
# This is last to override the Image section above
details['Selected'] = not state.ost.disabled
menu.add_option(name, details)
# Show menu
@ -240,6 +275,10 @@ def finalize_recovery(state: State, dry_run: bool = True) -> None:
# NOTE: This needs to be run last to avoid corrupting/erasing the backup GPT
relocate_backup_gpt(state, dry_run=dry_run)
# osTicket
if menu.options['Post results to osTicket']['Selected']:
state.post_to_osticket()
def is_missing_source_or_destination(state) -> bool:
"""Check if source or destination dissapeared, returns bool."""
@ -292,6 +331,9 @@ def main() -> None:
# Init
state = State(log_dir=log_path.parent)
if not args['--force-local-map']:
state.ost.select_ticket()
state.update_top_panes()
try:
state.init_recovery(args)
except (FileNotFoundError, std.GenericAbort):
@ -299,7 +341,7 @@ def main() -> None:
cli.abort()
# Show menu
main_menu = menus.main()
main_menu = menus.main(ost_disabled=state.ost.disabled)
settings_menu = menus.settings(state.mode)
while True:
selection = main_menu.advanced_select()
@ -316,14 +358,18 @@ def main() -> None:
# Detect drives
if 'Detect drives' in selection[0]:
cli.clear_screen()
cli.print_warning(DETECT_DRIVES_NOTICE)
if cli.ask('Are you sure you proceed?'):
cli.print_standard('Forcing controllers to rescan for devices...')
cmd = 'echo "- - -" | sudo tee /sys/class/scsi_host/host*/scan'
exe.run_program([cmd], check=False, shell=True)
if source_or_destination_changed(state):
cli.abort()
detect_drives(state)
# Tech note
if 'tech note' in selection[0]:
note_lines = state.ost.add_note(
'Please enter any additional information about this recovery',
)
state.update_top_panes(note_lines=note_lines)
# Start over
if 'Fresh start' in selection[0]:
state.fresh_start()
# Start recovery
if 'Start' in selection:
@ -379,6 +425,9 @@ def relocate_backup_gpt(state: State, dry_run: bool = True) -> None:
if proc.returncode:
cli.print_error('ERROR: Failed to relocate backup GPT.')
LOG.error('sfdisk result: %s, %s', proc.stdout, proc.stderr)
state.notes.add('WARNING: Failed to relocated backup GPT')
else:
state.notes.add('NOTE: Relocated backup GPT to the end of the disk.')
def run_ddrescue(state, block_pair, pass_name, settings, dry_run=True) -> None:
@ -448,6 +497,10 @@ def run_ddrescue(state, block_pair, pass_name, settings, dry_run=True) -> None:
LOG.info('ddrescue cmd: %s', cmd)
return
# Stats
if pass_name not in block_pair.stats:
block_pair.stats[pass_name] = {}
# Start ddrescue and ddrescueview (if enabled)
proc = exe.popen_program(cmd)
if (
@ -476,6 +529,7 @@ def run_ddrescue(state, block_pair, pass_name, settings, dry_run=True) -> None:
_i += 1
# Update progress
block_pair.stats[pass_name].update(get_stats())
block_pair.update_progress(pass_name)
state.update_progress_pane('Active')
@ -709,9 +763,17 @@ def zero_fill_gaps(
# Re-run ddrescue to zero-fill gaps
proc = exe.run_program(cmd, check=False, pipe=False)
LOG.info('Zero-fill result: %s', proc)
if proc.returncode:
cli.print_error('ERROR: Failed to zero-fill: {block_pair.destination}')
LOG.error('zero-fill error: %s, %s', proc.stdout, proc.stderr)
state.notes.add('WARNING: Failed to zero-fill destination')
else:
msg = (
'NOTE: Zero-filled gaps'
f'{" and extra space on destination." if extend_to_end else "."}'
)
state.notes.add(msg)
if __name__ == '__main__':

View file

@ -29,8 +29,10 @@ if PLATFORM == 'Darwin':
DDRESCUE_SETTINGS['Default']['--odirect'] = {'Selected': False, 'Hidden': True}
MENU_ACTIONS = (
'Start',
'Add tech note',
f'Change settings {ansi.color_string("(experts only)", "YELLOW")}',
f'Detect drives {ansi.color_string("(experts only)", "YELLOW")}',
f'Fresh start {ansi.color_string("(experts only)", "YELLOW")}',
'Quit')
MENU_TOGGLES = {
'Auto continue (if recovery % over threshold)': True,
@ -44,7 +46,7 @@ SETTING_PRESETS = (
# Functions
def main() -> cli.Menu:
def main(ost_disabled: bool) -> cli.Menu:
"""Main menu, returns wk.ui.cli.Menu."""
menu = cli.Menu(title=ansi.color_string('ddrescue TUI: Main Menu', 'GREEN'))
menu.separator = ' '
@ -56,6 +58,15 @@ def main() -> cli.Menu:
for toggle, selected in MENU_TOGGLES.items():
menu.add_toggle(toggle, {'Selected': selected})
# osTicket actions
if ost_disabled:
menu.actions['Add tech note']['Disabled'] = True
menu.actions['Add tech note']['Hidden'] = True
# TODO: Remove this ugly call
menu.actions[MENU_ACTIONS[2]]['Separator'] = True
else:
menu.actions['Add tech note']['Separator'] = True
# Done
return menu

View file

@ -15,7 +15,7 @@ from typing import Any
import psutil
import pytz
from wk import cfg, debug, exe, io, net, std
from wk import cfg, debug, exe, io, net, osticket, std
from wk.clone import menus
from wk.clone.block_pair import (
BlockPair,
@ -81,8 +81,10 @@ class State():
self.block_pairs: list[BlockPair] = []
self.destination: hw_disk.Disk | pathlib.Path = pathlib.Path('/dev/null')
self.log_dir: pathlib.Path = log_dir
self.ost = osticket.osTicket()
self.progress_out: pathlib.Path = self.log_dir.joinpath('progress.out')
self.mode: str = '?'
self.notes: set = set()
self.source: hw_disk.Disk | None = None
self.working_dir: pathlib.Path | None = None
self.ui: tui.TUI = tui.TUI('Source')
@ -145,7 +147,7 @@ class State():
errors_detected = True
# Check for minor errors
if not check_attributes(self.destination, only_blocking=False):
if not check_attributes(self.destination, only_blocking=True):
cli.print_warning(
f'Attribute error(s) detected for: {self.destination.path}',
)
@ -250,18 +252,45 @@ class State():
if not cli.ask(prompt_msg):
raise std.GenericAbort()
def fresh_start(self) -> None:
"""Clean working dir and reset progress."""
cli.print_error(
'This will reset all progress and create new map file(s).',
)
cli.print_warning(
"Please only proceed if you understand what you're doing!",
)
cli.print_warning(
'NOTE: This will keep the current partition selection(s).',
)
if not cli.ask('Continue?'):
return
# Clean and reset
clean_working_dir(self.working_dir)
for block_pair in self.block_pairs:
block_pair.reset_progress()
self.update_progress_pane('Idle')
def generate_report(self) -> list[str]:
"""Generate report of overall and per block_pair results, returns list."""
report = []
stats_str = (
'... pass: {pass_name} -- '
'non-trimmed: {non-trimmed}, '
'non-scraped: {non-scraped}, '
'bad-sectors: {bad-sector}, '
'slow reads: {slow reads}, '
'run time: {run time}'
)
# Header
report.append(f'{self.mode.title()} Results:')
report.append(' ')
report.append(f'Source: {self.source.description}')
report.append(f'... Source: {self.source.description}')
if self.mode == 'Clone':
report.append(f'Destination: {self.destination.description}')
report.append(f'... Destination: {self.destination.description}')
else:
report.append(f'Destination: {self.destination}/')
report.append(f'... Destination: {self.destination}/')
# Overall
report.append(' ')
@ -274,8 +303,17 @@ class State():
report.append(f'Overall rescued: {percent}, error size: {error_size_str}')
# Block-Pairs
if len(self.block_pairs) > 1:
report.append(' ')
if len(self.block_pairs) == 1:
stats = self.block_pairs[0].stats
if stats:
try:
for _name, _stats in stats.items():
report.append(stats_str.format(pass_name=_name, **_stats))
except KeyError:
# Ignore and omit stats
pass
else:
# Two or more block_pairs
for pair in self.block_pairs:
error_size = pair.get_error_size()
error_size_str = std.bytes_to_string(error_size, decimals=2)
@ -284,11 +322,26 @@ class State():
pair_size = std.bytes_to_string(pair.size, decimals=2)
percent = pair.get_percent_recovered()
percent = format_status_string(percent, width=0)
report.append(' ')
report.append(
f'{pair.source.name} ({pair_size}) '
f'rescued: {percent}, '
f'error size: {error_size_str}'
)
stats = pair.stats
if not stats:
continue
try:
for _name, _stats in stats.items():
report.append(stats_str.format(pass_name=_name, **_stats))
except KeyError:
# Ignore and omit stats
pass
# Notes
if self.notes:
report.append(' ')
report.extend(sorted(self.notes))
# Done
return report
@ -358,10 +411,17 @@ class State():
self.destination.update_details(skip_children=False)
# Confirmation #1
self.confirm_selections(
prompt_msg='Are these selections correct?',
source_parts=source_parts,
)
advanced_selection = False
try:
self.confirm_selections(
prompt_msg='Are these selections correct? (use "No" for advanced selection)',
source_parts=source_parts,
)
except std.GenericAbort:
if cli.ask('Proceed to advanced partition selection?'):
advanced_selection = True
else:
raise
# Update panes
self.update_progress_pane('Idle')
@ -371,6 +431,8 @@ class State():
self.mode,
self.destination,
force_local=docopt_args['--force-local-map'],
ticket_id=self.ost.ticket_id,
ticket_name=self.ost.ticket_name,
)
# Start fresh if requested
@ -378,10 +440,24 @@ class State():
clean_working_dir(self.working_dir)
# Add block pairs
if self.mode == 'Clone':
source_parts = add_clone_block_pairs(self)
if advanced_selection:
if self.mode == 'Clone':
source_parts = add_clone_block_pairs(self)
else:
source_parts = add_image_block_pairs(self)
else:
source_parts = add_image_block_pairs(self)
if self.mode == 'Clone':
source_parts.append(hw_disk.Disk(self.source.path))
self.add_block_pair(
hw_disk.Disk(self.source.path),
pathlib.Path(self.destination.path),
)
if self.mode == 'Image':
source_parts.append(hw_disk.Disk(self.source.path))
self.add_block_pair(
hw_disk.Disk(self.source.path),
self.destination,
)
# Update SMART data
## TODO: Verify if needed
@ -396,7 +472,8 @@ class State():
# Confirmation #2
self.update_progress_pane('Idle')
self.confirm_selections('Start recovery?', source_parts)
if advanced_selection:
self.confirm_selections('Start recovery?', source_parts)
# Unmount source and/or destination under macOS
if PLATFORM == 'Darwin':
@ -496,6 +573,29 @@ class State():
"""Check if all block_pairs completed pass_name, returns bool."""
return all(p.pass_complete(pass_name) for p in self.block_pairs)
def post_to_osticket(self):
"""Post results to osTicket."""
color = 'Diags'
percent = self.get_percent_recovered()
report = self.generate_report()
report[0] = f'ddrescue-tui {report[0]}'
if percent < 90:
color = 'Diags FAIL'
elif percent < 95:
color = 'Normal'
# Init osTicket if necessary
if not self.ost.ticket_id:
self.ost.init()
self.ost.select_ticket()
# Bail if user changed their mind
if not self.ost.ticket_id:
return
# Post report
self.ost.post_response('\n'.join(report), color=color)
def retry_all_passes(self) -> None:
"""Prep block_pairs for a retry recovery attempt."""
LOG.warning('Updating block_pairs for retry')
@ -612,8 +712,10 @@ class State():
# Write to progress file
self.progress_out.write_text('\n'.join(report), encoding='utf-8', errors='ignore')
def update_top_panes(self) -> None:
def update_top_panes(self, note_lines: list | None = None) -> None:
"""(Re)create top source/destination panes."""
if not note_lines:
note_lines = []
source_exists = True
source_str = ''
dest_exists = True
@ -681,6 +783,29 @@ class State():
dest_str,
)
# Bail if ticket not selected
if not self.ost:
return
# Ticket Details
self.ui.reset_subtitle_pane()
if self.ost.ticket_id and not self.ui.layout['Subtitle']['Panes']:
self.ui.add_subtitle_pane(
ansi.color_string(
[f'#{self.ost.ticket_id}', str(self.ost.ticket_name)],
[None, 'CYAN'],
),
str(self.ost.ticket_subject),
)
# Tech note
note_lines = self.ost.note.replace('...', '').splitlines()
if note_lines:
self.ui.add_subtitle_pane(
ansi.color_string('Tech Note', 'YELLOW'),
' | '.join(note_lines),
)
# Functions
def build_directory_report(path: pathlib.Path) -> list[str]:
@ -801,7 +926,7 @@ def build_object_report(obj) -> list[str]:
return report
def clean_working_dir(working_dir) -> None:
def clean_working_dir(working_dir, confirm=False) -> None:
"""Clean working directory to ensure a fresh recovery session.
NOTE: Data from previous sessions will be preserved
@ -814,6 +939,9 @@ def clean_working_dir(working_dir) -> None:
# Move settings, maps, etc to backup_dir
for entry in os.scandir(working_dir):
if entry.name.endswith(('.dd', '.json', '.map')):
if confirm and entry.name.endswith('.json'):
# Keep JSON settings if using the menu option
continue
new_path = f'{backup_dir}/{entry.name}'
new_path = io.non_clobber_path(new_path)
shutil.move(entry.path, new_path)
@ -953,11 +1081,22 @@ def get_percent_color(percent) -> str:
return color
def get_working_dir(mode, destination, force_local=False) -> pathlib.Path:
def get_working_dir(
mode,
destination,
force_local=False,
ticket_id=None,
ticket_name=None,
) -> pathlib.Path:
"""Get working directory using mode and destination, returns path."""
ticket_id = cli.get_ticket_id()
working_dir = None
# Set ticket ID
if ticket_id is None:
now = datetime.datetime.now(tz=TIMEZONE)
ticket_id = now.strftime('%Y-%m-%dT%H%M_%Z')
ticket_id = ticket_id.replace(' ', '_')
# Use preferred path if possible
if mode == 'Image':
try:
@ -988,6 +1127,12 @@ def get_working_dir(mode, destination, force_local=False) -> pathlib.Path:
if mode == 'Clone':
working_dir = working_dir.joinpath(ticket_id)
# Append ticket name if set
if ticket_name:
working_dir = working_dir.with_name(
f'{ticket_id}_{ticket_name.replace(" ", "-")}',
)
# Create directory
working_dir.mkdir(parents=True, exist_ok=True)
os.chdir(working_dir)

View file

@ -81,6 +81,7 @@ def build_cmd_kwargs(
cmd: list[str],
minimized: bool = False,
pipe: bool = True,
priority: bool = False,
shell: bool = False,
**kwargs) -> dict[str, Any]:
"""Build kwargs for use by subprocess functions, returns dict.
@ -119,6 +120,9 @@ def build_cmd_kwargs(
startupinfo.wShowWindow = 6
cmd_kwargs['startupinfo'] = startupinfo
# High priority
if priority:
cmd_kwargs['creationflags'] = subprocess.HIGH_PRIORITY_CLASS
# Pipe output
if pipe:
@ -268,6 +272,18 @@ def run_program(
return proc
def set_proc_priority(name, priority, exact=True):
"""Set process priority by name.
NOTE: priority currently can be only set to NORMAL or HIGH.
"""
if priority not in ('NORMAL', 'HIGH'):
raise RuntimeError('Invalid process priority specified.')
for proc in get_procs(name, exact=exact):
proc.nice(psutil.HIGH_PRIORITY_CLASS)
def start_thread(
function: Callable,
args: Iterable[Any] | None = None,

View file

@ -1,13 +1,25 @@
"""WizardKit: Graph Functions"""
# vim: sts=2 sw=2 ts=2
import base64
import json
import logging
import pathlib
import time
from matplotlib import pyplot
import requests
from wk.cfg.net import BENCHMARK_SERVER, IMGUR_CLIENT_ID
from wk.ui import ansi
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
GRAPH_FIGURE_SIZE = (
9.167, # 660px at 72dpi
4.167, # 300px at 72dpi
)
GRAPH_HORIZONTAL = ('', '', '', '', '', '', '', '')
GRAPH_VERTICAL = (
'', '', '', '',
@ -33,6 +45,137 @@ THRESH_GREAT = 750 * 1024**2
# Functions
def reduce_cpu_temp_list(list_of_temps, factor=5, start=30) -> list[float]:
"""Reduce temperature list by averaging adjacent values.
NOTE: This only averages values after the amount defined by start.
NOTE 2: If the last group is less than the factor it is simply dropped.
"""
new_list = list_of_temps[:start]
list_of_temps = list_of_temps[start:]
while list_of_temps:
group = list_of_temps[:factor]
list_of_temps = list_of_temps[factor:]
if len(group) < factor:
continue
new_list.append(sum(group)/factor)
return new_list
def export_cpu_graph(cpu_description, log_dir, sensor_history):
"""Exports PNG graph using matplotlib."""
lines = {}
offset_labels = []
out_path = pathlib.Path(f'{log_dir}/cpu_tests.png')
run_averages = {}
# Safety check
if not sensor_history:
raise RuntimeError('No sensor_data available.')
# Prep
offset = 0
for run_label, sensor_data in sensor_history:
all_run_temps = []
offset_labels.append((offset, run_label))
run_length = 0
for adapter in sensor_data.get('CPUTemps', {}).values():
for source, data in adapter.items():
y_values = data['Temps']
if run_label in ('Sysbench', 'Prime95'):
y_values = reduce_cpu_temp_list(y_values)
all_run_temps.extend(y_values)
run_length = max(run_length, len(y_values))
if source not in lines:
lines[source] = []
lines[source].extend(y_values)
try:
run_averages[run_label] = {
'Start': offset,
'End': offset+run_length,
'Temp': sum(all_run_temps) / len(all_run_temps),
}
except ZeroDivisionError:
# Ignore
pass
offset += run_length
# Build graph
_, ax = pyplot.subplots(
dpi=72,
figsize=list(x*2 for x in GRAPH_FIGURE_SIZE),
layout='constrained',
)
ax.set_title(cpu_description)
ax.set_xticks([])
for label, data in lines.items():
ax.plot(data, label=label)
#prev_label = 'Idle' # Always skip Idle
prev_label = ''
for offset, label in offset_labels:
color = 'grey'
if label == prev_label:
continue
if label == 'Sysbench':
color = 'orange'
if label == 'Prime95':
color = 'red'
if label == 'Cooldown':
color = 'blue'
label = ''
ax.axvline(x=offset, color=color, label=label, linestyle='--')
#ax.axvline(x=offset, color=color)
prev_label = label
for run_label, data in run_averages.items():
if run_label not in ('Prime95', 'Sysbench'):
continue
ax.axhline(
y = data['Temp'],
color = 'orange' if run_label == 'Sysbench' else 'red',
label = f'{run_label} (Avg)',
linestyle = ':',
)
ax.legend()
pyplot.savefig(out_path)
# Done
return out_path
def export_io_graph(disk, log_dir, read_rates):
"""Exports PNG graph using matplotlib."""
# Safety check
if not read_rates:
raise RuntimeError(f'No read rates for {disk.path}')
# Prep
max_rate = max(read_rates) / (1024**2)
max_rate = max(800, max_rate)
out_path = pathlib.Path(f'{log_dir}/{disk.path.name}_iobenchmark.png')
plot_data = ([], [])
# Prep data for graph
for i, rate in enumerate(read_rates):
plot_data[0].append((i+1) / len(read_rates) * 100) # Step
plot_data[1].append(int(rate / (1024**2))) # Data
# Build graph
_, ax = pyplot.subplots(
dpi=72,
figsize=GRAPH_FIGURE_SIZE,
layout='constrained',
)
ax.set_title('I/O Benchmark')
ax.plot(*plot_data, label=disk.description.replace('_', ' '))
ax.legend()
pyplot.savefig(out_path)
# Done
return out_path
def generate_horizontal_graph(
rate_list: list[float],
graph_width: int = 40,
@ -116,6 +259,76 @@ def merge_rates(
return merged_rates
def upload_to_imgur(image_path):
"""Upload image to Imgur and return image url as str."""
image_data = None
image_link = None
# Bail early
if not image_path:
raise RuntimeError(f'Invalid image path: {image_path}')
# Read image file and convert to base64 then convert to str
with open(image_path, 'rb') as _f:
image_data = base64.b64encode(_f.read()).decode()
# POST image
url = 'https://api.imgur.com/3/image'
boundary = '----WebKitFormBoundary7MA4YWxkTrZu0gW'
payload = (
f'--{boundary}\r\nContent-Disposition: form-data; '
f'name="image"\r\n\r\n{image_data}\r\n--{boundary}--'
)
headers = {
'content-type': f'multipart/form-data; boundary={boundary}',
'Authorization': f'Client-ID {IMGUR_CLIENT_ID}',
}
response = requests.request(
'POST',
url,
data=payload,
headers=headers,
timeout=60,
)
# Return image link
if response.ok:
json_data = json.loads(response.text)
image_link = json_data['data']['link']
return image_link
def upload_to_nextcloud(image_path, ticket_number, dev_name):
"""Upload image to Nextcloud server and return folder url as str."""
image_data = None
ticket_range = f'{ticket_number[:3]}00-{ticket_number[:3]}99'
# Bail early
if not image_path:
raise RuntimeError(f'Invalid image path: {image_path}')
# Read image file and convert to base64
with open(image_path, 'rb') as _f:
image_data = _f.read()
# PUT image
url = (
f'{BENCHMARK_SERVER["Url"]}/'
f'{ticket_range}/{ticket_number}_iobenchmark'
f'_{dev_name}_{time.strftime("%Y-%m-%d_%H%M_%z")}.png'
)
requests.put(
url,
data=image_data,
auth=(BENCHMARK_SERVER['User'], BENCHMARK_SERVER['Pass']),
headers={'X-Requested-With': 'XMLHttpRequest'},
timeout=60,
)
# Return folder link
return BENCHMARK_SERVER['Short Url']
def vertical_graph_line(percent: float, rate: float, scale: int = 32) -> str:
"""Build colored graph string using thresholds, returns str."""
color_bar = None

View file

@ -7,9 +7,11 @@ from . import diags
from . import disk
from . import keyboard
from . import network
from . import osticket
from . import screensavers
from . import sensors
from . import smart
from . import surface_scan
from . import system
from . import test
from . import volumes

View file

@ -2,10 +2,10 @@
# vim: sts=2 sw=2 ts=2
import logging
import platform
from subprocess import PIPE, STDOUT
from wk import graph
from wk.cfg.hw import (
IO_ALT_TEST_SIZE_FACTOR,
IO_BLOCK_SIZE,
@ -24,6 +24,9 @@ from wk.exe import run_program
from wk.std import PLATFORM
from wk.ui import ansi
if platform.system() != 'Windows':
from wk import graph
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
@ -97,7 +100,7 @@ def calc_io_dd_values(dev_size, test_mode=False) -> dict[str, int]:
}
def check_io_results(test_obj, rate_list, graph_width) -> None:
def check_io_results(state, test_obj, rate_list, graph_width) -> None:
"""Check I/O restuls and generate report using rate_list."""
avg_read = sum(rate_list) / len(rate_list)
min_read = min(rate_list)
@ -141,8 +144,36 @@ def check_io_results(test_obj, rate_list, graph_width) -> None:
else:
test_obj.set_status('Unknown')
# Export and upload graphs
export_and_upload_graphs(state, test_obj, rate_list)
def run_io_test(test_obj, log_path, test_mode=False) -> None:
def export_and_upload_graphs(state, test_obj, rate_list):
"""Export and upload graphs."""
image_path = None
try:
image_path = graph.export_io_graph(test_obj.dev, state.log_dir, rate_list)
except RuntimeError as err:
# Failed to export PNG, skip uploads below
LOG.error('Failed to export graph: %s', err)
test_obj.report.append('Failed to export graph')
return
# Upload PNG
if not state.ost.disabled and state.ost.ticket_id:
try:
imgur_url = graph.upload_to_imgur(image_path)
nextcloud_url = graph.upload_to_nextcloud(
image_path, state.ost.ticket_id, test_obj.dev.path.name)
test_obj.report.append(f'Imgur: {imgur_url}')
test_obj.report.append(f'Nextcloud: {nextcloud_url}')
except Exception as err:
LOG.error('%s', err)
LOG.error('Failed to upload graph')
test_obj.report.append('Failed to upload graph')
def run_io_test(state, test_obj, log_path, test_mode=False) -> None:
"""Run I/O benchmark and handle exceptions."""
dev_path = test_obj.dev.path
if PLATFORM == 'Darwin':
@ -211,7 +242,7 @@ def run_io_test(test_obj, log_path, test_mode=False) -> None:
offset += dd_values['Read Blocks'] + skip
# Check results
check_io_results(test_obj, read_rates, IO_GRAPH_WIDTH)
check_io_results(state, test_obj, read_rates, IO_GRAPH_WIDTH)

View file

@ -2,6 +2,7 @@
# vim: sts=2 sw=2 ts=2
import logging
import platform
import re
import subprocess
@ -13,6 +14,13 @@ from wk.os.mac import set_fans as macos_set_fans
from wk.std import PLATFORM
from wk.ui import ansi
if platform.system() != 'Windows':
from wk.graph import (
export_cpu_graph,
upload_to_imgur,
upload_to_nextcloud,
)
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
@ -20,8 +28,9 @@ SysbenchType = tuple[subprocess.Popen, TextIO]
# Functions
def check_cooling_results(sensors, test_object) -> None:
def check_cooling_results(state, test_object) -> None:
"""Check cooling result via sensor data."""
sensors = state.sensors
idle_temp = sensors.get_cpu_temp('Idle')
cooldown_temp = sensors.get_cpu_temp('Cooldown')
max_temp = sensors.get_cpu_temp('Max')
@ -84,6 +93,37 @@ def check_cooling_results(sensors, test_object) -> None:
*report_labels, only_cpu=True, include_avg_for=average_labels):
test_object.report.append(f' {line}')
# Export and upload graph
export_and_upload_graphs(state, test_object)
def export_and_upload_graphs(state, test_object):
"""Export and upload graphs."""
image_path = None
try:
image_path = export_cpu_graph(
cpu_description = state.system.cpu_description,
log_dir = state.log_dir,
sensor_history = state.sensors.history,
)
except RuntimeError as err:
# Failed to export PNG, skip uploads below
LOG.error('Failed to export graph: %s', err)
test_object.report.append('Failed to export graph')
return
# Upload PNG
if not state.ost.disabled and state.ost.ticket_id:
try:
imgur_url = upload_to_imgur(image_path)
nextcloud_url = upload_to_nextcloud(image_path, state.ost.ticket_id, 'cpu')
test_object.report.append(f'Imgur: {imgur_url}')
test_object.report.append(f'Nextcloud: {nextcloud_url}')
except Exception as err:
LOG.error('%s', err)
LOG.error('Failed to upload graph')
test_object.report.append('Failed to upload graph')
def check_mprime_results(test_obj, working_dir) -> None:
"""Check mprime log files and update test_obj."""

View file

@ -5,19 +5,22 @@ import atexit
import logging
import os
import pathlib
import platform
import subprocess
from docopt import docopt
from wk import cfg, debug, exe, log, std
from wk.cfg.hw import STATUS_COLORS
from wk import cfg, debug, exe, log, osticket, std
from wk.cfg.hw import CPU_TEST_MINUTES, STATUS_COLORS
from wk.hw import benchmark as hw_benchmark
from wk.hw import cpu as hw_cpu
from wk.hw import disk as hw_disk
from wk.hw import osticket as hw_osticket
from wk.hw import sensors as hw_sensors
from wk.hw import smart as hw_smart
from wk.hw import surface_scan as hw_surface_scan
from wk.hw import system as hw_system
from wk.hw import volumes as hw_volumes
from wk.hw.audio import audio_test
from wk.hw.keyboard import keyboard_test
from wk.hw.network import network_test
@ -35,15 +38,20 @@ Usage:
hw-diags (-h | --help)
Options:
-c --cli Force CLI mode
-h --help Show this page
-q --quick Skip menu and perform a quick check
-c --cli Force CLI mode
-h --help Show this page
-q --quick Skip menu and perform a quick check
-t --test-mode Run diags in test mode
'''
LOG = logging.getLogger(__name__)
IO_SIZE_SKIP_NAME = (
'Skip USB Benchmarks '
f'(< {std.bytes_to_string(cfg.hw.IO_SMALL_DISK, use_binary=False)})'
)
TEST_GROUPS = {
# Also used to build the menu options
## NOTE: This needs to be above MENU_SETS
'System Info': 'post_system_info',
'CPU (Sysbench)': 'cpu_test_sysbench',
'CPU (Prime95)': 'cpu_test_mprime',
'CPU (Cooling)': 'cpu_test_cooling',
@ -51,6 +59,7 @@ TEST_GROUPS = {
'Disk Self-Test': 'disk_self_test',
'Disk Surface Scan': 'disk_surface_scan',
'Disk I/O Benchmark': 'disk_io_benchmark',
'Disk Utilization': 'disk_volume_utilization',
}
MENU_ACTIONS = (
'Audio Test',
@ -62,7 +71,13 @@ MENU_ACTIONS = (
MENU_ACTIONS_SECRET = (
'Matrix',
'Tubes',
'?Secrets',
)
MENU_OPTIONS_SECRET = {
'Ignore SMART errors': False,
'Override CPU Testing Time (minutes)': CPU_TEST_MINUTES,
'Override Surface Scan Error Limit': 1,
}
MENU_OPTIONS_QUICK = ('Disk Attributes',)
MENU_SETS = {
'Full Diagnostic': (*TEST_GROUPS,),
@ -72,12 +87,16 @@ MENU_SETS = {
'Disk Self-Test',
'Disk Surface Scan',
'Disk I/O Benchmark',
'Disk Utilization',
),
'Disk Diagnostic (Quick)': ('Disk Attributes',),
'Disk Diagnostic (Quick)': ('Disk Attributes', 'Disk Utilization'),
}
MENU_TOGGLES = (
'Skip USB Benchmarks',
'osTicket Integration',
'osTicket Tech Note',
IO_SIZE_SKIP_NAME,
)
NUM_DISK_TESTS = len([s for s in TEST_GROUPS if s.startswith('Disk')])
PLATFORM = std.PLATFORM
# Classes
@ -86,7 +105,9 @@ class State():
def __init__(self, test_mode=False):
self.disks: list[hw_disk.Disk] = []
self.log_dir: pathlib.Path | None = None
self.ost = osticket.osTicket()
self.progress_file: pathlib.Path | None = None
self.secret_menu = build_secret_menu()
self.sensors: hw_sensors.Sensors = hw_sensors.Sensors()
self.system: hw_system.System | None = None
self.test_groups: list[TestGroup] = []
@ -127,6 +148,11 @@ class State():
self.disks.clear()
self.sensors = hw_sensors.Sensors()
self.test_groups.clear()
self.ui.remove_all_subtitle_panes()
# osTicket
self.ost.init()
self.ost.disabled = not menu.toggles['osTicket Integration']['Selected']
# Set log
self.log_dir = log.format_log_path(
@ -161,6 +187,17 @@ class State():
# Only add selected options
continue
if 'System' in name:
test = Test(dev=self.system, label=name, name=name)
self.test_groups.insert(
0,
TestGroup(
name=name,
function=globals()[TEST_GROUPS[name]],
test_objects=[test],
)
)
if 'CPU' in name:
self.system.tests.append(
Test(dev=self.system, label=name[5:-1], name=name),
@ -178,8 +215,11 @@ class State():
# Group CPU tests
if self.system.tests:
index = 0
if self.test_groups and self.test_groups[0].name.startswith('System'):
index = 1
self.test_groups.insert(
0,
index,
TestGroup(
name='CPU & Cooling',
function=run_cpu_tests,
@ -215,6 +255,16 @@ class State():
for test in disk.tests:
_f.write(f'\n{test.name}:\n')
_f.write('\n'.join(debug.generate_object_report(test, indent=1)))
if platform.system() == 'Darwin':
cmd = [(
f'sudo gpt -r show "{disk.path}"'
f' >> {debug_dir}/gpt_{disk.path.name}.info'
)]
exe.run_program(cmd, check=False, shell=True)
# osTicket
with open(f'{debug_dir}/osTicket.report', 'a', encoding='utf-8') as _f:
_f.write('\n'.join(debug.generate_object_report(self.ost)))
# SMC
if os.path.exists('/.wk-live-macos'):
@ -281,6 +331,9 @@ def build_menu(cli_mode=False, quick_mode=False) -> cli.Menu:
menu.add_set(name, {'Targets': targets})
menu.actions['Start']['Separator'] = True
# osTicket
menu.toggles['osTicket Tech Note']['Selected'] = False
# Update default selections for quick mode if necessary
if quick_mode:
for name, details in menu.options.items():
@ -292,6 +345,7 @@ def build_menu(cli_mode=False, quick_mode=False) -> cli.Menu:
menu.options['CPU (Sysbench)']['Selected'] = False
menu.options['CPU (Prime95)']['Selected'] = False
menu.options['CPU (Cooling)']['Selected'] = False
menu.options['System Info']['Selected'] = False
# Add CLI actions if necessary
if cli_mode or 'DISPLAY' not in os.environ:
@ -317,6 +371,24 @@ def build_menu(cli_mode=False, quick_mode=False) -> cli.Menu:
return menu
def build_secret_menu() -> cli.Menu:
title_text = [
ansi.color_string(('Expert Settings', "(It's a secret to everyone!)"), ('ORANGE', None)),
' ',
ansi.color_string(
[' !!', 'These settings can cause', 'MAJOR DAMAGE', 'to systems'],
[None, 'YELLOW', 'RED', 'YELLOW'],
),
' !! Please read the manual before making changes',
' ',
]
menu = cli.Menu(title='\n'.join(title_text))
for option, value in MENU_OPTIONS_SECRET.items():
menu.add_option(option, {'Selected': False, 'Value': value})
menu.add_action('Main Menu')
return menu
def cpu_tests_init(state: State) -> None:
"""Initialize CPU tests."""
sensors_out = pathlib.Path(f'{state.log_dir}/sensors.out')
@ -360,7 +432,7 @@ def cpu_test_cooling(state: State, test_object, test_mode=False) -> None:
if test_object.disabled:
return
hw_cpu.check_cooling_results(state.sensors, test_object)
hw_cpu.check_cooling_results(state, test_object)
state.update_progress_file()
@ -373,6 +445,11 @@ def cpu_test_mprime(state: State, test_object, test_mode=False) -> None:
test_minutes = cfg.hw.CPU_TEST_MINUTES
if test_mode:
test_minutes = cfg.hw.TEST_MODE_CPU_LIMIT
if state.secret_menu.options.get(
'Override CPU Testing Time (minutes)')['Selected']:
test_minutes = int(
state.secret_menu.options.get('Override CPU Testing Time (minutes)')['Value'],
)
# Bail early
if test_object.disabled:
@ -408,6 +485,7 @@ def cpu_test_mprime(state: State, test_object, test_mode=False) -> None:
aborted = True
# Stop Prime95
state.sensors.save_average_temps(temp_label='Cooldown', seconds=5)
hw_cpu.stop_mprime(proc)
# Get cooldown temp
@ -448,6 +526,11 @@ def cpu_test_sysbench(state: State, test_object, test_mode=False) -> None:
test_minutes = cfg.hw.CPU_TEST_MINUTES
if test_mode:
test_minutes = cfg.hw.TEST_MODE_CPU_LIMIT
if state.secret_menu.options.get(
'Override CPU Testing Time (minutes)')['Selected']:
test_minutes = int(
state.secret_menu.options.get('Override CPU Testing Time (minutes)')['Value'],
)
# Bail early
if test_object.disabled:
@ -479,6 +562,7 @@ def cpu_test_sysbench(state: State, test_object, test_mode=False) -> None:
LOG.error('Failed to find sysbench process', exc_info=True)
except KeyboardInterrupt:
aborted = True
state.sensors.save_average_temps(temp_label='Cooldown', seconds=5)
hw_cpu.stop_sysbench(proc, filehandle)
# Get cooldown temp
@ -507,9 +591,11 @@ def cpu_test_sysbench(state: State, test_object, test_mode=False) -> None:
# 0 == Completed w/out issue
# -2 == Stopped with INT signal
# -15 == Stopped with TERM signal
test_object.failed = True
test_object.set_status('Failed')
test_object.report.append(f' Failed with return code: {proc.returncode}')
else:
test_object.passed = True
test_object.set_status('Passed')
test_object.report.append(' Completed without issue.')
state.update_progress_file()
@ -548,13 +634,18 @@ def disk_io_benchmark(
)
state.ui.set_current_pane_height(10)
for test in test_objects:
if test.disabled:
# Skip
if (
skip_usb
and test.dev.bus == 'USB'
and test.dev.size < cfg.hw.IO_SMALL_DISK
):
test.set_status('Skipped')
test.disabled = True
continue
# Skip USB devices if requested
if skip_usb and test.dev.bus == 'USB':
test.set_status('Skipped')
# Start benchmark
for test in test_objects:
if test.disabled:
continue
# Start benchmark
@ -571,7 +662,7 @@ def disk_io_benchmark(
)
state.update_progress_file()
try:
hw_benchmark.run_io_test(test, test_log, test_mode=test_mode)
hw_benchmark.run_io_test(state, test, test_log, test_mode=test_mode)
except KeyboardInterrupt:
aborted = True
except (subprocess.CalledProcessError, TypeError, ValueError) as err:
@ -696,7 +787,12 @@ def disk_surface_scan(state: State, test_objects, test_mode=False) -> None:
"""Read-only disk surface scan using badblocks."""
LOG.info('Disk Surface Scan (badblocks)')
aborted = False
max_errors = 1
threads = []
if state.secret_menu.options.get(
'Override Surface Scan Error Limit')['Selected']:
max_errors = state.secret_menu.options.get(
'Override Surface Scan Error Limit')['Value']
# Update panes
state.update_title_text(
@ -713,7 +809,7 @@ def disk_surface_scan(state: State, test_objects, test_mode=False) -> None:
# Start thread
test_log = f'{state.log_dir}/{test.dev.path.name}_badblocks.log'
threads.append(exe.start_thread(
hw_surface_scan.run_scan, args=(test, test_log, test_mode),
hw_surface_scan.run_scan, args=(test, test_log, test_mode, max_errors),
))
# Show progress
@ -746,6 +842,17 @@ def disk_surface_scan(state: State, test_objects, test_mode=False) -> None:
raise std.GenericAbort('Aborted')
def disk_volume_utilization(state, test_objects, test_mode=False) -> None:
"""Check disk for full volumes."""
_ = test_mode
LOG.info('Disk Utilization')
for test in test_objects:
hw_volumes.check_volume_utilization(test)
# Done
state.update_progress_file()
def main() -> None:
"""Main function for hardware diagnostics."""
args = docopt(DOCSTRING)
@ -762,6 +869,7 @@ def main() -> None:
# Quick Mode
if args['--quick']:
menu.toggles['osTicket Integration']['Selected'] = False
run_diags(state, menu, quick_mode=True, test_mode=args['--test-mode'])
return
@ -793,9 +901,11 @@ def main() -> None:
state.ui.update_clock()
# Secrets
if '?Secrets' in selection:
state.secret_menu.settings_select()
if 'Matrix' in selection:
screensaver('matrix')
elif 'Tubes' in selection:
if 'Tubes' in selection:
# Tubes ≈≈ Pipes?
screensaver('pipes')
@ -817,6 +927,33 @@ def main() -> None:
state.update_title_text('Main Menu')
def post_system_info(state, test_objects, test_mode=False) -> None:
"""Post system info to osTicket."""
_ = test_mode
# Bail early
if state.ost.disabled:
return
# Build report
report = state.system.generate_full_report()
if state.disks:
report.append('\n[Disks]')
for disk in state.disks:
report.append(f'... {disk.description}')
# Post to osTicket
state.ost.post_response('\n'.join(report))
# Update test object(s)
for test_object in test_objects:
test_object.passed = True
test_object.set_status('Done')
# Done
state.update_progress_file()
def print_countdown(proc, seconds) -> None:
"""Print countdown to screen while proc is alive."""
seconds = int(seconds)
@ -854,8 +991,22 @@ def run_cpu_tests(state: State, test_objects, test_mode=False) -> None:
cpu_tests_end(state)
state.update_progress_file()
# Post results to osTicket
if not state.ost.disabled:
failed = any(test.failed for test in state.system.tests)
cli.print_info('Posting results to osTicket...')
state.ost.post_response(
hw_osticket.build_report(state.system, 'CPU'),
color='Diags FAIL' if failed else 'Diags',
)
def run_diags(state: State, menu, quick_mode=False, test_mode=False) -> None:
def run_diags(
state: State,
menu: cli.Menu,
quick_mode: bool = False,
test_mode: bool = False,
) -> None:
"""Run selected diagnostics."""
aborted = False
atexit.register(state.save_debug_reports)
@ -867,6 +1018,32 @@ def run_diags(state: State, menu, quick_mode=False, test_mode=False) -> None:
cli.pause()
return
# osTicket
if not state.ost.disabled:
# Select Ticket
state.ost.select_ticket()
# Update top_text
if state.ost.ticket_id:
state.ui.add_subtitle_pane(
cli.color_string(
[f'#{state.ost.ticket_id}', str(state.ost.ticket_name)],
[None, 'CYAN'],
),
str(state.ost.ticket_subject),
)
# Add note
if (state.ost.ticket_id
and menu.toggles['osTicket Tech Note']['Selected']):
note_lines = state.ost.add_note()
if note_lines:
state.ui.add_subtitle_pane(
cli.color_string('Tech Note', 'YELLOW'),
' | '.join(note_lines),
)
# Run tests
for group in state.test_groups:
@ -874,7 +1051,7 @@ def run_diags(state: State, menu, quick_mode=False, test_mode=False) -> None:
function = group.function
args = [group.test_objects]
if group.name == 'Disk I/O Benchmark':
args.append(menu.toggles['Skip USB Benchmarks']['Selected'])
args.append(menu.toggles[IO_SIZE_SKIP_NAME]['Selected'])
state.ui.clear_current_pane()
try:
function(state, *args, test_mode=test_mode)
@ -896,10 +1073,17 @@ def run_diags(state: State, menu, quick_mode=False, test_mode=False) -> None:
if test.status == 'Pending':
test.set_status('Aborted')
# Post disk results
hw_osticket.post_disk_results(state, NUM_DISK_TESTS)
# Show results
show_results(state)
# Update checkboxes
hw_osticket.update_checkboxes(state, NUM_DISK_TESTS)
# Done
state.ui.remove_all_subtitle_panes()
state.save_debug_reports()
atexit.unregister(state.save_debug_reports)
if quick_mode:
@ -930,7 +1114,7 @@ def show_results(state: State) -> None:
]
if cpu_tests_enabled:
cli.print_success('CPU:')
cli.print_report(state.system.generate_report())
cli.print_report(state.system.generate_cpu_ram_report())
cli.print_standard(' ')
# Disk Tests

216
scripts/wk/hw/osticket.py Normal file
View file

@ -0,0 +1,216 @@
"""WizardKit: osTicket hardware diagnostic functions"""
# vim: sts=2 sw=2 ts=2
import logging
import re
from wk import osticket
from wk.cfg.hw import (
REGEX_BLOCK_GRAPH,
REGEX_SMART_ATTRIBUTES,
)
from wk.hw import smart as hw_smart
from wk.ui import cli
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
# Functions
def build_report(dev, dev_type, num_disk_tests=None):
"""Build report for posting to osTicket, returns str."""
report = []
# Combined result
if dev_type == 'CPU' or len(dev.tests) == num_disk_tests:
# Build list of failed tests (if any)
failed_tests = [t.name for t in dev.tests if t.failed]
failed_tests = [name.replace('Disk ', '') for name in failed_tests]
if len(failed_tests) > 2:
failed_tests = f'{", ".join(failed_tests[:-1])}, & {failed_tests[-1]}'
else:
failed_tests = ' & '.join(failed_tests)
# Get overall result
result = 'UNKNOWN'
if any(t.failed for t in dev.tests):
result = 'FAILED'
elif all(t.passed for t in dev.tests):
result = 'PASSED'
# Add to report
report.append(
f'{dev_type} hardware diagnostic tests: {result}'
f'{" ("+failed_tests+")" if failed_tests else ""}'
)
report.append('')
# Description
if hasattr(dev, 'cpu_description'):
report.append(dev.cpu_description)
else:
report.append(dev.description)
if hasattr(dev, 'ram_total'):
if len(dev.ram_dimms) == 1 and 'justTotalRAM' in dev.ram_dimms[0]:
report.append(f'{dev.ram_total} (Total - no DIMM info available)')
else:
report.append(f'{dev.ram_total} ({", ".join(dev.ram_dimms)})')
if hasattr(dev, 'serial') and dev.serial:
report.append(f'Serial Number: {dev.serial}')
report.append('')
# Notes
if hasattr(dev, 'notes') and dev.notes:
report.append('Notes')
report.extend([f'... {note}' for note in dev.notes])
report.append('')
# Tests
for test in dev.tests:
report.append(f'{test.name} ({test.status})')
# Report
if test.name == 'Disk Attributes' and dev.attributes:
report.extend(
convert_report(
hw_smart.generate_attribute_report(dev),
start_index=0,
),
)
else:
report.extend(convert_report(test.report, start_index=1))
# I/O graph upload report
report.extend(getattr(test, 'upload_report', []))
# Spacer
report.append('')
# Remove last line if empty
if not report[-1].strip():
report.pop(-1)
# Done
return cli.strip_colors('\n'.join(report))
def convert_report(original_report, start_index):
"""Convert report to an osTicket compatible type, returns list."""
report = []
# Convert report
for line in original_report[start_index:]:
# Remove colors and leading spaces
line = cli.strip_colors(line)
line = re.sub(r'^\s+', '', line)
# Disk I/O Benchmark
if REGEX_BLOCK_GRAPH.search(line):
line = REGEX_BLOCK_GRAPH.sub('', line)
line = line.strip()
# SMART attributes
match = REGEX_SMART_ATTRIBUTES.search(line)
if match:
# Switch decimal and hex labels
_dec = f'{match.group("decimal"):>3}'
_dec = osticket.pad_with_dots(_dec)
_hex = match.group('hex')
_data = match.group('data')
line = f'{_hex}/{_dec}: {_data}'
line = line.replace('failed', 'FAILED')
# Skip empty lines
if not line.strip():
continue
# Fix inner spacing
for spacing in re.findall(r'\s\s+', line):
new_padding = osticket.pad_with_dots(spacing)
new_padding += ' '
line = line.replace(spacing, new_padding)
# Indent line
line = f'... {line}'
# Add to (converted) report
report.append(line)
# Done
return report
def post_disk_results(state, num_disk_tests):
"""Post disk test results for all disks."""
disk_tests = []
for group in state.test_groups:
if group.name.startswith('Disk'):
disk_tests.extend(group.test_objects)
# Bail if no disk tests were run
if not disk_tests or state.ost.disabled:
return
# Post disk results
cli.print_info('Posting results to osTicket...')
for disk in state.disks:
state.ost.post_response(
build_report(disk, 'Disk', num_disk_tests),
color='Diags FAIL' if any(t.failed for t in disk.tests) else 'Diags',
)
def update_checkboxes(state, num_disk_tests):
"""Update osTicket checkboxes after confirmation."""
cpu_tests = []
disk_tests = []
num_disk_tests_run = len(state.test_groups)
# Build list of tests
for group in state.test_groups:
if group.name.startswith('CPU'):
cpu_tests.extend(group.test_objects)
num_disk_tests_run -= 1
elif group.name.startswith('Disk'):
disk_tests.extend(group.test_objects)
elif group.name.startswith('System'):
num_disk_tests_run -= 1
# Bail if osTicket integration disabled
if state.ost.disabled:
return
# Bail if values not confirmed
if not cli.ask('Update osTicket checkboxes using the data above?'):
return
# CPU max temp and pass/fail
if cpu_tests:
state.ost.set_cpu_max_temp(state.sensors.get_cpu_temp('Max'))
if any(t.failed for t in cpu_tests):
state.ost.set_flag_failed('CPU')
elif all(t.passed for t in cpu_tests):
state.ost.set_flag_passed('CPU')
# Check results for all disks
if state.disks:
all_disks_passed = True
for disk in state.disks:
if any(t.failed for t in disk.tests):
# Mark failed disk in osTicket and stop checking results
all_disks_passed = False
state.ost.set_flag_failed('Disk')
break
if not all(t.passed for t in disk.tests):
all_disks_passed = False
break
# All disks passed
if all_disks_passed and num_disk_tests_run == num_disk_tests:
# Only mark as passed if a full disk diagnostic passed
state.ost.set_flag_passed('Disk')
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -10,7 +10,7 @@ from wk.cfg.hw import (
BADBLOCKS_LARGE_DISK,
BADBLOCKS_REGEX,
BADBLOCKS_RESULTS_REGEX,
BADBLOCKS_SKIP_REGEX,
#BADBLOCKS_SKIP_REGEX,
TEST_MODE_BADBLOCKS_LIMIT,
)
from wk.exe import run_program
@ -25,34 +25,52 @@ LOG = logging.getLogger(__name__)
# Functions
def check_surface_scan_results(test_obj, log_path) -> None:
"""Check results and set test status."""
report = []
report_color = None
# Read result
with open(log_path, 'r', encoding='utf-8') as _f:
for line in _f.readlines():
line = ansi.strip_colors(line.strip())
if not line or BADBLOCKS_SKIP_REGEX.match(line):
if not line:
# Skip
continue
# Clean line by removing backspaces/etc
line = BADBLOCKS_RESULTS_REGEX.sub(r'\1 \2', line)
match = BADBLOCKS_RESULTS_REGEX.match(line)
if match:
if match.group(2) == ' done':
line = BADBLOCKS_RESULTS_REGEX.sub(r'\1done', line)
else:
line = BADBLOCKS_RESULTS_REGEX.sub(r'\1\2', line)
line = line.replace(r'\x08', '')
line = line.strip()
# Add to report
report.append(line)
match = BADBLOCKS_REGEX.search(line)
if match:
if all(s == '0' for s in match.groups()):
test_obj.passed = True
test_obj.report.append(f' {line}')
test_obj.set_status('Passed')
else:
test_obj.failed = True
test_obj.report.append(f' {ansi.color_string(line, "YELLOW")}')
test_obj.set_status('Failed')
else:
test_obj.report.append(f' {ansi.color_string(line, "YELLOW")}')
# Set report color and save to test_obj
if test_obj.failed:
report_color = 'RED'
elif not test_obj.passed:
report_color = 'YELLOW'
for line in report:
test_obj.report.append(f' {ansi.color_string(line, report_color)}')
# Handle undefined result status
if not (test_obj.passed or test_obj.failed):
test_obj.set_status('Unknown')
def run_scan(test_obj, log_path, test_mode=False) -> None:
def run_scan(test_obj, log_path, test_mode=False, max_errors=1) -> None:
"""Run surface scan and handle exceptions."""
block_size = '1024'
dev = test_obj.dev
@ -71,8 +89,17 @@ def run_scan(test_obj, log_path, test_mode=False) -> None:
or dev.size >= BADBLOCKS_LARGE_DISK):
block_size = '4096'
# Max errors
if int(max_errors) <= 0:
max_errors = ''
else:
max_errors = f'-e{max_errors}'
# Start scan
cmd = ['sudo', 'badblocks', '-sv', '-b', block_size, '-e', '1', dev_path]
cmd = ['sudo', 'badblocks', '-sv', '-b', block_size]
if max_errors:
cmd.append(max_errors)
cmd.append(dev_path)
if test_mode:
# Only test a limited scope instead of the whole device
cmd.append(TEST_MODE_BADBLOCKS_LIMIT)

View file

@ -2,6 +2,7 @@
# vim: sts=2 sw=2 ts=2
import logging
import os
import plistlib
import re
@ -17,6 +18,7 @@ from wk.ui import ansi
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
EVERYMAC_URL = 'https://everymac.com/ultimate-mac-lookup/?search_keywords='
@dataclass(slots=True)
@ -33,7 +35,7 @@ class System:
self.set_cpu_description()
self.get_ram_details()
def generate_report(self) -> list[str]:
def generate_cpu_ram_report(self) -> list[str]:
"""Generate CPU & RAM report, returns list."""
report = []
report.append(ansi.color_string('Device', 'BLUE'))
@ -49,6 +51,38 @@ class System:
return report
def generate_full_report(self) -> list[str]:
"""Generate full report, returns list."""
report = ['[System]']
report.extend([f'... {line}' for line in self.get_system_info()])
report.append('\n[Motherboard]')
report.extend([f'... {line}' for line in self.get_mobo_info()])
report.append('\n[BIOS]')
report.extend([f'... {line}' for line in self.get_bios_info()])
report.append('\n[CPU]')
report.append(f'... {self.cpu_description}')
report.append('\n[RAM]')
report.append(f'... {self.ram_total} ({", ".join(self.ram_dimms)})')
report.append('\n[GPU]')
report.extend([f'... {line}' for line in self.get_gpu_info()])
return report
def get_bios_info(self) -> list[str]:
"""Get BIOS details, returns list."""
report = []
# Bail early
if PLATFORM != 'Linux':
# Only Linux is supported ATM
return report
# Get details
report.append(f'Version: {get_dmi_info_linux("bios_version")}')
report.append(f'Released: {get_dmi_info_linux("bios_date")}')
# Done
return report
def get_cpu_details(self) -> None:
"""Get CPU details using OS specific methods."""
cmd = ['lscpu', '--json']
@ -68,6 +102,78 @@ class System:
continue
self.raw_details[_field] = _data
def get_gpu_info(self) -> list[str]:
"""Get GPU details, returns list."""
report = []
# Bail early
if PLATFORM != 'Linux':
# Only Linux is supported ATM
return report
# Get PCI details
proc = run_program(['lspci'])
for line in proc.stdout.splitlines():
if 'VGA' not in line:
continue
line = re.sub('^.*:', '', line)
line = re.sub('Integrated Graphics Controller.*', 'iGPU', line)
line = line.replace('Advanced Micro Devices, Inc.', 'AMD')
line = line.replace('Intel Corporation', 'Intel')
line = line.replace('Generation Core Processor Family', 'Gen')
report.append(f'{line.strip()}')
# Get GLX info
if 'DISPLAY' in os.environ or 'WAYLAND_DISPLAY' in os.environ:
proc = run_program(['glxinfo'])
for line in proc.stdout.splitlines():
if 'OpenGL renderer' in line:
line = re.sub('^.*:', '', line)
report.append(line.strip())
break
# Done
return report
def get_mobo_info(self) -> list[str]:
"""Get motherboard details, returns list."""
report = []
# Bail early
if PLATFORM != 'Linux':
# Only Linux is supported ATM
return report
# Get details
report.append(f'Vendor: {get_dmi_info_linux("board_vendor")}')
report.append(f'Name: {get_dmi_info_linux("board_name")}')
report.append(f'Version: {get_dmi_info_linux("board_version")}')
report.append(f'Serial: {get_dmi_info_linux("board_serial")}')
# Done
return report
def get_system_info(self) -> list[str]:
"""Get system details, returns list."""
report = []
# Bail early
if PLATFORM != 'Linux':
# Only Linux is supported ATM
return report
# Get details
vendor = get_dmi_info_linux("sys_vendor")
serial = get_dmi_info_linux("product_serial")
report.append(f'Vendor: {vendor}')
report.append(f'Name: {get_dmi_info_linux("product_name")}')
report.append(f'Serial: {serial}')
if 'apple' in vendor.lower():
report.append(f'{EVERYMAC_URL}{serial}')
# Done
return report
def get_ram_details(self) -> None:
"""Get RAM details using OS specific methods."""
if PLATFORM == 'Darwin':
@ -105,6 +211,16 @@ class System:
self.cpu_description = re.sub(r'\s+', ' ', proc.stdout.strip())
def get_dmi_info_linux(value) -> str:
"""Get DMI info, returns str."""
dmi_path = '/sys/devices/virtual/dmi/id'
cmd = ['sudo', 'cat', f'{dmi_path}/{value}']
proc = run_program(cmd, check=False)
if proc.returncode:
return '[???]'
return proc.stdout.strip()
def get_ram_list_linux() -> list[list]:
"""Get RAM list using dmidecode."""
cmd = ['sudo', 'dmidecode', '--type', 'memory']

123
scripts/wk/hw/volumes.py Normal file
View file

@ -0,0 +1,123 @@
"""WizardKit: Volume functions"""
# vim: sts=2 sw=2 ts=2
import logging
import re
from wk import os as wk_os
from wk.cfg.hw import (
VOLUME_FAILURE_THRESHOLD,
VOLUME_WARNING_THRESHOLD,
VOLUME_SIZE_THRESHOLD,
)
from wk.std import PLATFORM, bytes_to_string
from wk.ui.ansi import color_string
# STATIC VARIABLES
LOG = logging.getLogger(__name__)
# Functions
def add_dev_line(test_obj, details) -> None:
"""Add device line to test report."""
if details is test_obj.dev:
details = details.raw_details
filesystem = details['fstype']
report_line = re.sub(r"^/dev/", " ", details['name'])
label = details['label']
if label:
label = f', "{color_string(label, "CYAN")}"'
report_line += f' ({filesystem}{label if label else ""})'
# Bail early
if not filesystem:
# Skip devices without a filesystem
return
# Get sizes
used = -1
percent_used = -1
size = details['size']
if PLATFORM == 'Darwin':
size = int(details.get('TotalSize', -1))
free = int(details.get('FreeSpace', 0))
used = size - free
elif PLATFORM == 'Linux':
free = details.get('fsavail', 0)
used = details.get('fsused', -1)
if free is None:
free = 0
if used is None:
used = -1
percent_used = (used / size) * 100
# Report Bitlocker
if filesystem == 'BitLocker':
test_obj.report.append(f'{report_line} {bytes_to_string(size)}')
# Handle unsupported devices
if not details['mountpoint']:
# Under Linux the volume needs to be mounted to get used space
used = -1
# Check for failures
if (used > 0
and percent_used >= VOLUME_FAILURE_THRESHOLD
and size >= VOLUME_SIZE_THRESHOLD * 1024**3):
test_obj.failed = True
# Build and color size_line if needed
color = None
if test_obj.failed:
color = 'RED'
elif percent_used >= VOLUME_WARNING_THRESHOLD:
color = 'YELLOW'
size_line = f'{bytes_to_string(size)}'
if used > 0:
size_line += f' ({bytes_to_string(used)} used, {percent_used:0.0f}% full)'
size_line = color_string(size_line, str(color))
# Done
test_obj.report.append(f'{report_line} {size_line}')
def check_volume_utilization(test_obj) -> None:
"""Check volume utilization using OS specific methods."""
dev = test_obj.dev
# Mount all volumes (read only if possible)
mount_all_volumes(test_obj.dev)
dev.update_details(skip_children=False)
# Build report
test_obj.report.append(color_string('Disk Utilization', 'BLUE'))
for _d in (dev, *dev.children):
add_dev_line(test_obj, _d)
# Update test object
if test_obj.failed:
test_obj.dev.add_note('Full volume(s) detected', color='YELLOW')
test_obj.passed = False
test_obj.set_status('Failed')
else:
test_obj.passed = True
test_obj.set_status('Passed')
def mount_all_volumes(dev) -> None:
"""Mount all volumes for dev using."""
if PLATFORM == 'Darwin':
# NOTE: Disabled due to a bug they should already be mounted by macOS
#wk_os.mac.mount_disk(device_path=dev.path)
pass
elif PLATFORM == 'Linux':
wk_os.linux.mount_volumes(
device_path=dev.path,
read_write=False,
scan_corestorage=not any(t.failed for t in dev.tests),
)
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -11,7 +11,6 @@ import re
from wk.cfg.launchers import LAUNCHERS
from wk.cfg.main import ARCHIVE_PASSWORD, KIT_NAME_FULL
from wk.cfg.music import MUSIC_MOD, MUSIC_SNES, MUSIC_SNES_BAD
from wk.cfg.sources import SOURCES
from wk.exe import popen_program, run_program, wait_for_procs
from wk.io import copy_file, delete_item, recursive_copy, rename_item
@ -123,9 +122,16 @@ def download_aida64() -> None:
def download_autoruns() -> None:
"""Download Autoruns."""
for item in ('Autoruns32', 'Autoruns64'):
out_path = BIN_DIR.joinpath(f'Sysinternals/{item}.exe')
download_file(out_path, SOURCES[item])
out_path = BIN_DIR.joinpath(f'Sysinternals/Autoruns64.exe')
download_file(out_path, SOURCES['Autoruns64'])
def download_bcuninstaller() -> None:
"""Download Bulk Crap Uninstaller."""
archive = download_to_temp('BCU.zip', SOURCES['BCUninstaller'])
extract_to_bin(archive, 'BCUninstaller')
delete_from_temp('BCU.zip')
delete_item(BIN_DIR.joinpath('BCUninstaller/win-x86'))
def download_bleachbit() -> None:
@ -145,9 +151,6 @@ def download_bleachbit() -> None:
def download_bluescreenview() -> None:
"""Download BlueScreenView."""
archive_32 = download_to_temp(
'bluescreenview32.zip', SOURCES['BlueScreenView32'],
)
archive_64 = download_to_temp(
'bluescreenview64.zip', SOURCES['BlueScreenView64'],
)
@ -157,11 +160,21 @@ def download_bluescreenview() -> None:
out_path.joinpath('BlueScreenView.exe'),
out_path.joinpath('BlueScreenView64.exe'),
)
extract_archive(archive_32, out_path)
delete_from_temp('bluescreenview32.zip')
delete_from_temp('bluescreenview64.zip')
def download_coretemp():
"""Download Core Temp."""
archive_64 = download_to_temp('coretemp64.zip', SOURCES['CoreTemp64'])
out_path = BIN_DIR.joinpath('CoreTemp')
extract_archive(archive_64, out_path, 'Core Temp.exe')
rename_item(
out_path.joinpath('Core Temp.exe'),
out_path.joinpath('CoreTemp64.exe'),
)
delete_from_temp('coretemp64.zip')
def download_ddu() -> None:
"""Download Display Driver Uninstaller."""
archive = download_to_temp('DDU.exe', SOURCES['DDU'])
@ -178,13 +191,6 @@ def download_ddu() -> None:
delete_from_temp('DDU.exe')
def download_bcuninstaller() -> None:
"""Download Bulk Crap Uninstaller."""
archive = download_to_temp('BCU.zip', SOURCES['BCUninstaller'])
extract_to_bin(archive, 'BCUninstaller')
delete_from_temp('BCU.zip')
def download_erunt() -> None:
"""Download ERUNT."""
archive = download_to_temp('erunt.zip', SOURCES['ERUNT'])
@ -194,7 +200,6 @@ def download_erunt() -> None:
def download_everything() -> None:
"""Download Everything."""
archive_32 = download_to_temp('everything32.zip', SOURCES['Everything32'])
archive_64 = download_to_temp('everything64.zip', SOURCES['Everything64'])
out_path = BIN_DIR.joinpath('Everything')
extract_archive(archive_64, out_path, 'Everything.exe')
@ -202,8 +207,6 @@ def download_everything() -> None:
out_path.joinpath('Everything.exe'),
out_path.joinpath('Everything64.exe'),
)
extract_archive(archive_32, out_path)
delete_from_temp('everything32.zip')
delete_from_temp('everything64.zip')
@ -211,14 +214,11 @@ def download_fastcopy() -> None:
"""Download FastCopy."""
installer = download_to_temp('FastCopyInstaller.exe', SOURCES['FastCopy'])
out_path = BIN_DIR.joinpath('FastCopy')
tmp_path = TMP_DIR.joinpath('FastCopy64')
run_program([installer, '/NOSUBDIR', f'/DIR={out_path}', '/EXTRACT32'])
run_program([installer, '/NOSUBDIR', f'/DIR={tmp_path}', '/EXTRACT64'])
run_program([installer, '/NOSUBDIR', f'/DIR={out_path}', '/EXTRACT64'])
rename_item(
tmp_path.joinpath('FastCopy.exe'),
out_path.joinpath('FastCopy.exe'),
out_path.joinpath('FastCopy64.exe'),
)
delete_from_temp('FastCopy64')
delete_from_temp('FastCopyInstaller.exe')
delete_item(BIN_DIR.joinpath('FastCopy/setup.exe'))
@ -243,11 +243,23 @@ def download_furmark() -> None:
delete_from_temp('FurMarkInstall')
def download_hwinfo() -> None:
"""Download HWiNFO."""
archive = download_to_temp('HWiNFO.zip', SOURCES['HWiNFO'])
extract_to_bin(archive, 'HWiNFO')
delete_from_temp('HWiNFO.zip')
def download_libreoffice() -> None:
"""Download LibreOffice."""
out_path = INSTALLERS_DIR.joinpath(f'LibreOffice64.msi')
download_file(
out_path,
SOURCES[f'LibreOffice64'],
referer='https://www.libreoffice.org/download/download-libreoffice/',
)
ui.sleep(1)
def download_linux_reader():
"""Download Linux Reader."""
installer = download_to_temp('LinuxReader.exe', SOURCES['Linux Reader'])
out_path = BIN_DIR.joinpath('LinuxReader')
extract_archive(installer, out_path, '-x!*PLUGINSDIR', '-x!Uninstall*')
delete_from_temp('LinuxReader.exe')
def download_macs_fan_control() -> None:
@ -256,18 +268,6 @@ def download_macs_fan_control() -> None:
download_file(out_path, SOURCES['Macs Fan Control'])
def download_libreoffice() -> None:
"""Download LibreOffice."""
for arch in 32, 64:
out_path = INSTALLERS_DIR.joinpath(f'LibreOffice{arch}.msi')
download_file(
out_path,
SOURCES[f'LibreOffice{arch}'],
referer='https://www.libreoffice.org/download/download-libreoffice/',
)
ui.sleep(1)
def download_neutron() -> None:
"""Download Neutron."""
archive = download_to_temp('neutron.zip', SOURCES['Neutron'])
@ -295,6 +295,13 @@ def download_openshell() -> None:
download_file(out_path, SOURCES[name[:-4]])
def download_prime95():
"""Download Prime95."""
archive = download_to_temp('prime95.zip', SOURCES['Prime95'])
extract_to_bin(archive, 'Prime95')
delete_from_temp('prime95.zip')
def download_putty() -> None:
"""Download PuTTY."""
archive = download_to_temp('putty.zip', SOURCES['PuTTY'])
@ -302,6 +309,12 @@ def download_putty() -> None:
delete_from_temp('putty.zip')
def download_shutup10():
"""Download O&O ShutUp10."""
out_path = BIN_DIR.joinpath('ShutUp10/OOSU10.exe')
download_file(out_path, SOURCES['ShutUp10'])
def download_snappy_driver_installer_origin() -> None:
"""Download Snappy Driver Installer Origin."""
archive = download_to_temp('aria2.zip', SOURCES['Aria2'])
@ -372,6 +385,29 @@ def download_snappy_driver_installer_origin() -> None:
delete_from_temp('fake.7z')
def download_windows_repair_aio():
"""Download Windows Repair AIO."""
archive = download_to_temp('winrepairaio.zip', SOURCES['Windows Repair AIO'])
out_path = BIN_DIR.joinpath('WinRepairAIO')
tmp_path = TMP_DIR.joinpath('WinRepairAIO')
extract_archive(archive, tmp_path)
for item in tmp_path.joinpath('Tweaking.com - Windows Repair').iterdir():
try:
rename_item(item, out_path.joinpath(item.name))
except FileExistsError:
# Ignore and use our defaults
pass
delete_from_temp('WinRepairAIO')
delete_from_temp('winrepairaio.zip')
def download_winscp():
"""Download WinSCP."""
archive = download_to_temp('winscp.zip', SOURCES['WinSCP'])
extract_to_bin(archive, 'WinSCP')
delete_from_temp('winscp.zip')
def download_wiztree() -> None:
"""Download WizTree."""
archive = download_to_temp('wiztree.zip', SOURCES['WizTree'])
@ -407,57 +443,6 @@ def download_xmplay() -> None:
delete_from_temp('xmp-rar.zip')
delete_from_temp('Innocuous.zip')
def download_xmplay_music() -> None:
"""Download XMPlay Music."""
music_tmp = TMP_DIR.joinpath('music')
music_tmp.mkdir(exist_ok=True)
current_dir = os.getcwd()
os.chdir(music_tmp)
url_mod = 'https://api.modarchive.org/downloads.php'
url_rsn = 'http://snesmusic.org/v2/download.php'
# Download music
for song_id, song_name in MUSIC_MOD:
download_file(
music_tmp.joinpath(f'MOD/{song_name}'),
f'{url_mod}?moduleid={song_id}#{song_name}',
)
for game in MUSIC_SNES:
download_file(
music_tmp.joinpath(f'SNES/{game}.rsn'),
f'{url_rsn}?spcNow={game}',
)
# Extract SNES archives
for item in music_tmp.joinpath('SNES').iterdir():
cmd = [
SEVEN_ZIP,
'x', item, f'-oSNES\\{item.stem}',
'-bso0', '-bse0', '-bsp0',
]
run_program(cmd)
delete_item(item)
# Remove bad songs
for game, globs in MUSIC_SNES_BAD.items():
for glob in globs:
for item in music_tmp.joinpath(f'SNES/{game}').glob(glob):
delete_item(item)
# Compress music
cmd = [
SEVEN_ZIP,
'a', '-t7z', '-mx=9',
'-bso0', '-bse0', '-bsp0',
BIN_DIR.joinpath('XMPlay/music.7z'),
'MOD', 'SNES',
]
run_program(cmd)
os.chdir(current_dir)
# Cleanup
delete_from_temp('music')
# "Main" Function
def build_kit() -> None:
@ -482,23 +467,27 @@ def build_kit() -> None:
try_print.run('Autoruns...', download_autoruns)
try_print.run('BleachBit...', download_bleachbit)
try_print.run('BlueScreenView...', download_bluescreenview)
try_print.run('CoreTemp...', download_coretemp)
try_print.run('ERUNT...', download_erunt)
try_print.run('BulkCrapUninstaller...', download_bcuninstaller)
try_print.run('DDU...', download_ddu)
try_print.run('Everything...', download_everything)
try_print.run('FastCopy...', download_fastcopy)
try_print.run('FurMark...', download_furmark)
try_print.run('HWiNFO...', download_hwinfo)
try_print.run('LibreOffice...', download_libreoffice)
try_print.run('Linux Reader...', download_linux_reader)
try_print.run('Macs Fan Control...', download_macs_fan_control)
try_print.run('Neutron...', download_neutron)
try_print.run('Notepad++...', download_notepad_plus_plus)
try_print.run('O&O ShutUp10...', download_shutup10)
try_print.run('OpenShell...', download_openshell)
try_print.run('Prime95...', download_prime95)
try_print.run('PuTTY...', download_putty)
try_print.run('Snappy Driver Installer...', download_snappy_driver_installer_origin)
try_print.run('WinSCP...', download_winscp)
try_print.run('Windows Repair AIO...', download_windows_repair_aio)
try_print.run('WizTree...', download_wiztree)
try_print.run('XMPlay...', download_xmplay)
try_print.run('XMPlay Music...', download_xmplay_music)
try_print.run('Snappy Driver Installer...', download_snappy_driver_installer_origin)
# Pause
print('', flush=True)

View file

@ -6,14 +6,18 @@ import pathlib
import platform
from datetime import datetime, timedelta
from subprocess import CompletedProcess, Popen
from subprocess import CalledProcessError, CompletedProcess, Popen
import requests
from wk.cfg.main import ARCHIVE_PASSWORD
from wk.cfg.net import SDIO_SERVER
from wk.cfg.sources import DOWNLOAD_FREQUENCY, SOURCES
from wk.exe import popen_program, run_program
from wk.io import get_path_obj
from wk.net import mount_network_share
from wk.std import GenericError, sleep
from wk.ui.cli import abort, ask, print_error
# STATIC VARIABLES
@ -25,6 +29,14 @@ HEADERS = {
'Gecko/20100101 Firefox/97.0'
),
}
MOUNT_EXCEPTIONS = (RuntimeError, CalledProcessError)
SDIO_REMOTE_PATH = get_path_obj(
(
fr'\\{SDIO_SERVER["Address"]}\{SDIO_SERVER["Share"]}\{SDIO_SERVER["Path"]}'
fr'\SDIO{"64" if ARCH == "64" else ""}.exe'
),
resolve=False,
)
# "GLOBAL" VARIABLES
@ -203,6 +215,52 @@ def get_tool_path(folder, name, check=True, suffix=None) -> pathlib.Path:
return tool_path
def get_sdio_path(interactive: bool) -> pathlib.Path:
"""Try to mount SDIO server."""
use_network = False
sdio_path = get_tool_path("SDIO", "SDIO")
def _mount_server() -> CompletedProcess:
if interactive:
print('Connecting to server... (Press CTRL+c to use local copy)')
return mount_network_share(SDIO_SERVER, read_write=False)
def _try_again(error_msg: str) -> bool:
"""Ask to try again or quit."""
print_error(error_msg)
if ask(' Try again?'):
return True
if not ask(' Use local version?'):
abort()
return False
# Bail early
if not SDIO_SERVER['Address']:
return sdio_path
# Main loop
while True:
try:
proc = _mount_server()
except KeyboardInterrupt:
break
except MOUNT_EXCEPTIONS as err:
if not (interactive and _try_again(f' ERROR: {err}')):
break
else:
if proc.returncode == 0:
# Network copy available
use_network = True
break
# Failed to mount
if not (interactive and _try_again(' Failed to mount server')):
break
# Done
if use_network:
sdio_path = SDIO_REMOTE_PATH
return sdio_path
def run_tool(
folder, name, *run_args,
cbin=False, cwd=False, download=False, popen=False,

View file

@ -36,6 +36,7 @@ Usage:
[--linux PATH]
[--main-kit PATH]
[--winpe PATH]
[--eset PATH]
[--extra-dir PATH]
[EXTRA_IMAGES...]
build-ufd (-h | --help)
@ -44,6 +45,7 @@ Options:
-e PATH, --extra-dir PATH
-k PATH, --main-kit PATH
-l PATH, --linux PATH
-s PATH, --eset PATH
-u PATH, --ufd-device PATH
-w PATH, --winpe PATH
@ -569,7 +571,10 @@ def update_boot_entries(ufd_dev, images=None) -> None:
'sed',
'--in-place',
'--regexp-extended',
f's/___+/{uuids[0]}/',
(
f's/___+/{uuids[0]}/; '
f's#by-label/(eSysRescueLiveCD|{ISO_LABEL}|{UFD_LABEL})#by-uuid/{uuids[0]}#'
),
*configs,
]
run_program(cmd)

View file

@ -21,7 +21,7 @@ if os.name == 'nt':
)
else:
# Example: "/home/tech/Logs"
DEFAULT_LOG_DIR = f'{os.path.expanduser("~")}/Logs'
DEFAULT_LOG_DIR = pathlib.Path('~/Logs').expanduser().resolve()
DEFAULT_LOG_NAME = cfg.main.KIT_NAME_FULL

View file

@ -88,11 +88,15 @@ def mount_backup_shares(read_write: bool = False) -> list[str]:
continue
# Mount share
proc = mount_network_share(details, mount_point, read_write=read_write)
if proc.returncode:
try:
proc = mount_network_share(details, mount_point, read_write=read_write)
if proc.returncode:
report.append(f'Failed to Mount {mount_str}')
else:
report.append(f'Mounted {mount_str}')
except RuntimeError:
# Assuming we're not connected to a network?
report.append(f'Failed to Mount {mount_str}')
else:
report.append(f'Mounted {mount_str}')
# Done
return report

View file

@ -2,9 +2,13 @@
# vim: sts=2 sw=2 ts=2
import logging
import plistlib
import re
from wk import std
from wk.exe import run_program
from wk.hw.disk import Disk
from wk.ui import cli
# STATIC VARIABLES
@ -32,6 +36,189 @@ def decode_smc_bytes(text) -> int:
return result
def get_apfs_volumes(device_path):
"""Get APFS volumes contained in device_path, returns list."""
volumes = []
containers = []
# Get APFS details
cmd = ['diskutil', 'apfs', 'list', '-plist']
proc = run_program(cmd, check=False, encoding=None, errors=None)
try:
plist_data = plistlib.loads(proc.stdout)
except (TypeError, ValueError):
# Invalid / corrupt plist data? return empty dict to avoid crash
LOG.error('Failed to get diskutil apfs list for %s', device_path)
# Find container(s) relating to device_path
for container in plist_data['Containers']:
if container['DesignatedPhysicalStore'] == device_path:
containers.append(container)
# Add volumes
for container in containers:
for volume in container['Volumes']:
mount_volume(volume['DeviceIdentifier'])
volumes.append(Disk(f'/dev/{volume["DeviceIdentifier"]}'))
# Done
return volumes
def get_core_storage_volumes(device_path):
"""Get CoreStorage volumes contained in device_path, returns list."""
disks = []
volumes = []
# Get coreStorage details
cmd = ['diskutil', 'corestorage', 'list', '-plist']
proc = run_program(cmd, check=False, encoding=None, errors=None)
try:
plist_data = plistlib.loads(proc.stdout)
except (TypeError, ValueError):
# invalid / corrupt plist data? return empty dict to avoid crash
LOG.error('failed to get diskutil corestorage list for %s', device_path)
# Find related virtual disks
for l_vg in plist_data['CoreStorageLogicalVolumeGroups']:
related = False
# Compare parent physical volumes against device_path
for p_v in l_vg['CoreStoragePhysicalVolumes']:
uuid = p_v['CoreStorageUUID']
cmd = ['diskutil', 'coreStorage', 'info', '-plist', uuid]
proc = run_program(cmd, check=False, encoding=None, errors=None)
try:
plist_data = plistlib.loads(proc.stdout)
except (TypeError, ValueError):
LOG.error('failed to get diskutil corestorage info for %s', uuid)
continue
if plist_data['DeviceIdentifier'] == device_path:
related = True
break
# Move on if no related p_v was found
if not related:
continue
# Add logical disks to list
for l_vf in l_vg['CoreStorageLogicalVolumeFamilies']:
for l_v in l_vf['CoreStorageLogicalVolumes']:
uuid = l_v['CoreStorageUUID']
cmd = ['diskutil', 'coreStorage', 'info', '-plist', uuid]
proc = run_program(cmd, check=False, encoding=None, errors=None)
try:
plist_data = plistlib.loads(proc.stdout)
except (TypeError, ValueError):
LOG.error('failed to get diskutil corestorage info for %s', uuid)
continue
disks.append(plist_data['DeviceIdentifier'])
# Get volumes from logical disks
for disk in disks:
cmd = ['diskutil', 'list', '-plist', f'/dev/{disk}']
proc = run_program(cmd, check=False, encoding=None, errors=None)
try:
plist_data = plistlib.loads(proc.stdout)
disk_data = plist_data['AllDisksAndPartitions'][0]
except (TypeError, ValueError):
LOG.error('Failed to get diskutil list for %s', disk)
continue
if 'Partitions' in disk_data:
for part in disk_data['Partitions']:
mount_volume(part['DeviceIdentifier'])
volumes.append(Disk(f'/dev/{part["DeviceIdentifier"]}'))
elif 'VolumeName' in disk_data:
mount_volume(disk_data['DeviceIdentifier'])
volumes.append(Disk(f'/dev/{disk_data["DeviceIdentifier"]}'))
# Done
return volumes
def mount_volume(volume_path, read_only=True):
"""Try to mount a volume, returns subprocess.CompletedProcess."""
cmd = ['sudo', 'diskutil', 'mount']
if read_only:
cmd.append('readOnly')
cmd.append(volume_path)
proc = run_program(cmd, check=False)
# Done
return proc
def mount_disk(device_path=None):
"""Mount all detected volumes, returns list.
NOTE: If device_path is specified then only volumes
under that path will be mounted.
"""
report = []
volumes = []
# Get device details
cmd = [
'diskutil',
'list',
'-plist',
]
if device_path:
cmd.append(device_path)
proc = run_program(cmd, check=False, encoding=None, errors=None)
try:
plist_data = plistlib.loads(proc.stdout)
except (TypeError, ValueError):
# Invalid / corrupt plist data? return empty dict to avoid crash
LOG.error('Failed to get diskutil list for %s', device_path)
return report
# Mount and add volumes
for part in plist_data['AllDisksAndPartitions'][0]['Partitions']:
proc = mount_volume(part['DeviceIdentifier'])
# Add volume
volumes.append(Disk(f'/dev/{part["DeviceIdentifier"]}'))
# Add sub-volumes
if proc.returncode:
if part['Content'] == 'Apple_CoreStorage':
volumes.extend(get_core_storage_volumes(part['DeviceIdentifier']))
elif part['Content'] == 'Apple_APFS':
volumes.extend(get_apfs_volumes(part['DeviceIdentifier']))
# Build report from volume list
for vol in volumes:
result = f'{vol.details["name"]:<20}'
# Containers
if vol.details['Content'] in ('Apple_APFS', 'Apple_CoreStorage'):
result += f'{vol.details["Content"].replace("Apple_", "")} container'
report.append(cli.color_string(result, 'BLUE'))
continue
# Unknown partitions
if not vol.details['mountpoint']:
result += 'Failed to mount'
report.append(cli.color_string(result, 'RED'))
continue
# Volumes
result += f'{"Mounted on "+vol.details.get("mountpoint", "?"):<40}'
size = vol.details.get('TotalSize', -1)
free = vol.details.get('FreeSpace', -1)
used = size - free
result = (
f'{result} ({vol.details.get("fstype", "Unknown FS")+",":<5} '
f'{std.bytes_to_string(used, decimals=1):>9} used, '
f'{std.bytes_to_string(free, decimals=1):>9} free) '
)
report.append(result)
# Done
return report
def set_fans(mode) -> None:
"""Set fans to auto or max."""
if mode == 'auto':

View file

@ -28,6 +28,7 @@ from wk.cfg.windows_builds import (
)
from wk.exe import get_json_from_command, run_program, wait_for_procs
from wk.kit.tools import find_kit_dir
from wk.osticket import osTicket
from wk.std import (
GenericError,
GenericWarning,
@ -206,22 +207,65 @@ def check_4k_alignment(show_alert=False) -> list[str]:
return report
def defender_is_disabled():
"""Check if Windows Defender is enabled, returns bool."""
reg_key = r'Software\Microsoft\Windows Defender'
disabled = reg_read_value('HKLM', reg_key, 'DisableAntiSpyware')
disabled = disabled or reg_read_value('HKLM', reg_key, 'DisableAntiVirus')
return bool(disabled)
def export_bitlocker_info() -> None:
"""Get Bitlocker info and save to the base directory of the kit."""
commands = [
['manage-bde', '-status', SYSTEMDRIVE],
['manage-bde', '-protectors', '-get', SYSTEMDRIVE],
]
"""Get Bitlocker info and save to either the base directory of the kit or osTicket."""
script_path = find_kit_dir('Scripts').joinpath('export_bitlocker.ps1')
cmd = ['PowerShell', '-ExecutionPolicy', 'Bypass', '-File', script_path]
file_name = ''
output = []
# Get filename
file_name = ui.input_text(prompt_msg='Enter filename')
file_path = pathlib.Path(f'../../Bitlocker_{file_name}.txt').resolve()
# Include OS info
if os.environ.get('SYSTEMDRIVE', 'C:').upper() == 'X:':
# Assuming this is true
output.append('[Check run under Win10XPE]')
else:
output.append(get_os_name())
output.append('')
# Save info
# Get Bitlocker info
proc = run_program(cmd, check=False)
if proc.returncode or not proc.stdout.strip():
output.append('Error: Failed to export Bitlocker info\n')
output.extend(proc.stdout.splitlines())
# Show info
print('\n'.join(output), '\n\n')
# Save to osTicket
ost = osTicket()
ost.init()
ost.select_ticket()
if not ost.disabled:
ost.post_response('\n'.join(output))
result = 'OK'
if ost.disabled or ost.errors:
result = 'Unknown'
print(
ansi.color_string(
['\nPost info to osTicket... ', result],
[None, 'GREEN' if result == 'OK' else 'YELLOW'],
)
)
# Save to file
if ost.ticket_name:
file_name = f'{ost.ticket_id}_{ost.ticket_name.replace(" ", "-")}'
if not file_name:
file_name = ui.input_text(prompt_msg='Enter filename: ', allow_empty=False)
file_path = pathlib.Path(f'../../../Bitlocker_{file_name}.txt').resolve()
with open(file_path, 'a', encoding='utf-8') as _f:
for cmd in commands:
proc = run_program(cmd, check=False)
_f.write(f'{proc.stdout}\n\n')
_f.write('\n'.join(output))
# Done
ui.pause('\nPress Enter to exit...')
def get_installed_antivirus() -> list[str]:

431
scripts/wk/osticket.py Normal file
View file

@ -0,0 +1,431 @@
"""WizardKit: osTicket Functions"""
# vim: sts=2 sw=2 ts=2
import atexit
import logging
import pathlib
import time
import mariadb
from wk.cfg.hw import TESTSTATION_FILE
from wk.cfg.osticket import SQL, STAFF
from wk.ui import ansi, cli
# STATIC_VARIABLES
LOG = logging.getLogger(__name__)
FLAG_CODES = {
'Pass': 1,
'Fail': 2,
}
FLAG_CPU = 'zTemps'
FLAG_DISK = 'zHDTune'
FLAG_MAX_TEMP = 'zMaxTemp'
RESPONSE_COLOR_CODES = {
'Normal': '0',
'Contact': '1',
'Diags': '2',
'Diags FAIL': '3',
'Money': '4',
}
TABLE_RESPONSE = 'ost_ticket_response'
TABLE_TICKET = 'ost_ticket'
# Classes
class osTicket():
"""Class to track osTicket data and functions."""
def __init__(self):
self.db_connection = None
self.db_cursor = None
self.disabled: bool = False
self.errors: bool = False
self.note: str = ''
self.ticket_id: int | None = None
self.ticket_name: str | None = None
self.ticket_subject: str | None = None
# Ensure connection is closed atexit
atexit.register(self._disconnect)
def _connect(self, silent=True):
"""Establish connection to osTicket."""
if self.disabled:
return
# Connect to database
try:
self.db_connection = mariadb.connect(
host=SQL['Host'],
port=SQL['Port'],
database=SQL['DB'],
user=SQL['User'],
password=SQL['Pass'],
connect_timeout=5,
)
self.db_cursor = self.db_connection.cursor()
except mariadb.Error:
# Assuming network issue or bad creds
pass
# Raise exception if necessary
if self.db_cursor is None:
LOG.error('Failed to connect to osTicket database')
if silent:
# Don't raise exceptions, just disable ost
self.disabled = True
self.errors = True
else:
raise RuntimeError('Failed to connect to osTicket database')
def _disconnect(self):
"""Close osTicket connection."""
for db_obj in (self.db_cursor, self.db_connection):
if db_obj:
try:
db_obj.close()
except mariadb.Error:
# Ignore errors since vars will be reset below
pass
# Reset db objects
self.db_cursor = None
self.db_connection = None
def _get_flag(self, flag_name):
"""Get flag for self.ticket_id from osTicket, returns str."""
flag_value = None
self._verify_ticket_id()
# Build SQL cmd
sql_cmd = (
f"SELECT `{flag_name}` FROM `{SQL['DB']}`.`{TABLE_TICKET}` "
f"WHERE `{TABLE_TICKET}`.`ticket_id` = {self.ticket_id};"
)
# Run SQL cmd
try:
self.db_cursor.execute(sql_cmd)
for s in self.db_cursor:
flag_value = s[0]
except mariadb.Error as err_msg:
cli.print_error(err_msg)
self.errors = True
# Done
return str(flag_value)
def _get_ticket_field(self, ticket_id, field_name):
"""Get field for ticket_id from osTicket, returns str."""
field_data = None
# Build SQL cmd
sql_cmd = (
f"SELECT {field_name} FROM `{SQL['DB']}`.`{TABLE_TICKET}` "
f"WHERE `{TABLE_TICKET}`.`ticket_id` = {ticket_id};"
)
# Lookup data
# NOTE: If multiple entries are found it will return the last
try:
self.db_cursor.execute(sql_cmd)
for result in self.db_cursor:
field_data = result[0]
except mariadb.Error as err_msg:
# Show error and return None
cli.print_error(err_msg)
# Done
return field_data
def _set_flag(self, flag_name, flag_value):
"""Set flag_name to flag_value for ticket_id in osTicket.
NOTE: This will overwrite any existing value.
"""
self._verify_ticket_id()
sql_cmd = (
f"UPDATE `{SQL['DB']}`.`{TABLE_TICKET}` "
f"SET `{flag_name}` = '{flag_value}' "
f"WHERE `{TABLE_TICKET}`.`ticket_id` = {self.ticket_id};"
)
# Run SQL cmd
try:
self.db_cursor.execute(sql_cmd)
except mariadb.Error as err_msg:
cli.print_error(err_msg)
self.errors = True
def _verify_ticket_id(self):
"""Verify that ticket_id has been set."""
if not self.ticket_id:
LOG.error('Ticket ID not set')
raise RuntimeError('Ticket ID not set')
def add_note(self, prompt: str = 'Add note') -> list[str]:
"""Add note to be included in osTicket replies."""
lines = []
if not prompt:
prompt = 'Please enter any additional information for this ticket'
# Instructions
cli.print_standard(prompt)
cli.print_info(' (End note with an empty line)')
cli.print_standard(' ')
# Get note
while True:
text = cli.input_text('> ', allow_empty=True)
if not text:
break
lines.append(text.strip())
# Save note
if lines:
self.note = lines[0]
for line in lines[1:]:
self.note += f'\n...{line}'
else:
self.note = ''
# Done
return lines
def init(self):
"""Revert to defaults."""
self._disconnect()
self.disabled = False
self.errors = False
self.note = None
self.ticket_id = None
self.ticket_name = None
def post_response(self, response, color='Normal'):
"""Post a reply to a ticket in osTicket."""
cur_date_time = time.strftime('%Y-%m-%d %H:%M:%S')
lines = []
test_station = get_test_station_name()
self._connect(silent=True)
self._verify_ticket_id()
# Bail if disabled
if self.disabled:
return
# Format response
if test_station:
lines.append(f'[Test-Station: {test_station}]')
lines.append(f'[Report for ticket #{self.ticket_id} {self.ticket_name}]')
if self.note:
lines.append(f'[Note] {self.note}\n')
lines.append(str(response))
response = '\n'.join(lines)
response = ansi.strip_colors(response)
response = response.replace("`", "'").replace("'", "\\'")
# Build SQL cmd
sql_cmd = (
f"INSERT INTO `{SQL['DB']}`.`{TABLE_RESPONSE}` "
f"(ticket_id, staff_id, staff_name, response, created, code) "
f"VALUES ("
f" '{self.ticket_id}',"
f" '{STAFF['ID']}',"
f" '{STAFF['Name']}',"
f" '{response}',"
f" '{cur_date_time}',"
f" '{RESPONSE_COLOR_CODES.get(color, 'Normal')}'"
f");"
)
# Run SQL cmd
try:
self.db_cursor.execute(sql_cmd)
except mariadb.Error:
self.errors = True
# Update ticket last repsonse field
sql_cmd = (
f"UPDATE `{SQL['DB']}`.`{TABLE_TICKET}`"
f"SET `lastresponse` = '{cur_date_time}' "
f"WHERE `{TABLE_TICKET}`.`ticket_id` = {self.ticket_id};"
)
try:
self.db_cursor.execute(sql_cmd)
except mariadb.Error:
self.errors = True
# Done
self._disconnect()
def select_ticket(self):
"""Set ticket number and name from osTicket DB."""
cli.print_standard('Connecting to osTicket...')
# Bail if disabled
if self.disabled:
return
# Connect
while True:
try:
self._connect(silent=False)
except (mariadb.Error, RuntimeError):
cli.print_warning('Failed to connect to osTicket')
if not cli.ask('Try again?'):
cli.print_standard('Integration disabled for this session')
self.disabled = True
return
else:
# Connection successful
break
# Main loop
while self.ticket_id is None:
cli.print_standard(' ')
_id = cli.input_text(
'Enter ticket number (or leave blank to disable): ', allow_empty=True,
)
_id = _id.strip()
# Nothing entered
if not _id:
print(' ')
if cli.ask('Disable osTicket integration for this session?'):
self.disabled = True
break
# Invalid ID entered
if not _id.isnumeric():
continue
# Valid ID entered, lookup name
_name = self._get_ticket_field(_id, 'name')
# Invalid ticket selected
if _name is None:
cli.print_error(f'Ticket #{_id} not found')
continue
# Valid ticket selected, lookup subject
_subject = self._get_ticket_field(_id, 'subject')
# Verify selection
cli.print_colored(
['You have selected ticket', f'#{_id}', _name],
[None, 'BLUE', None],
)
cli.print_colored(f' {_subject}', 'CYAN')
cli.print_standard(' ')
if cli.ask('Is this correct?'):
self.ticket_id = _id
self.ticket_name = _name
self.ticket_subject = _subject
# Done
self._disconnect()
def set_cpu_max_temp(self, temp):
"""Set CPU max temp in osTicket for ticket_id.
NOTE: This will not replace a higher temp value.
"""
LOG.info('Setting max CPU temp to %s', temp)
self._connect(silent=True)
# Bail if disabled
if self.disabled:
return
# Compare to current temp
current_temp = self._get_flag(FLAG_MAX_TEMP)
if str(current_temp).isnumeric() and int(current_temp) > temp:
cli.print_warning('Not replacing higher temp in osTicket')
self._disconnect()
return
# Update temp
self._set_flag(FLAG_MAX_TEMP, int(temp))
# Done
self._disconnect()
def set_flag_failed(self, flag_name):
"""Set flag as failed in osTicket for ticket_id."""
LOG.warning('Setting osTicket %s checkbox to FAILED', flag_name)
real_flag_name = FLAG_CPU if flag_name == 'CPU' else FLAG_DISK
self._connect(silent=True)
# Bail if disabled
if self.disabled:
return
# Set flag
self._set_flag(real_flag_name, FLAG_CODES['Fail'])
# Done
self._disconnect()
def set_flag_passed(self, flag_name):
"""Set flag as passed in osTicket for ticket_id.
NOTE: This will not overwrite a failed status.
"""
real_flag_name = FLAG_CPU if flag_name == 'CPU' else FLAG_DISK
self._connect(silent=True)
# Bail if disabled
if self.disabled:
return
# Bail if flag checkbox set as FAILED
if self._get_flag(real_flag_name) == str(FLAG_CODES['Fail']):
cli.print_warning(
f'Not replacing osTicket {flag_name} checkbox FAILED value',
)
self._disconnect()
return
# Current value != to FAILED, updating checkbox
LOG.info('Setting osTicket %s checkbox to PASSED', flag_name)
self._set_flag(real_flag_name, FLAG_CODES['Pass'])
# Done
self._disconnect()
# Functions
def get_test_station_name():
"""Get test station name, returns str."""
hostname_file = pathlib.Path(TESTSTATION_FILE)
# Bail early
if not hostname_file.exists():
return ''
if not hostname_file.read_text(encoding='utf-8'):
return ''
# Done
return hostname_file.read_text(encoding='utf-8').splitlines()[0]
def pad_with_dots(text, pad_right=False):
"""Replace space padding with dots, returns str.
NOTE: This is a dumb hack to better align text in osTicket.
"""
text = str(text)
text = text.replace(' ', '..')
if '.' in text:
if pad_right:
text = f'{text}.'
else:
text = f'.{text}'
# Done
return text
if __name__ == '__main__':
print("This file is not meant to be called directly.")

View file

@ -30,6 +30,7 @@ from wk.exe import (
get_procs,
run_program,
popen_program,
set_proc_priority,
wait_for_procs,
)
from wk.io import (
@ -39,14 +40,22 @@ from wk.io import (
non_clobber_path,
rename_item,
)
from wk.kit.tools import (download_tool, get_tool_path, run_tool)
from wk.kit.tools import (
download_tool,
extract_archive,
get_tool_path,
run_tool,
)
from wk.log import (
format_log_path,
get_root_logger_path,
update_log_path,
)
from wk.os.win import (
ARCH,
OS_VERSION,
defender_is_disabled,
show_alert_box,
get_timezone,
set_timezone,
reg_delete_value,
@ -85,7 +94,16 @@ PROGRAMFILES_32 = os.environ.get(
'PROGRAMFILES', r'C:\Program Files (x86)',
),
)
MBAM_EXE_PATH = 'Malwarebytes/Anti-Malware/mbam.exe'
MBAM_PRESERVE_MARKER = 'Preserve-MBAM.marker'
MBAM_UNINSTALL_KEY = (
r'Software\Microsoft\Windows\CurrentVersion\Uninstall'
r'\{35065F43-4BB2-439A-BFF7-0F1014F2E0CD}_is1'
)
MS_ANTIVIRUS_ENABLED = 0x1000
PROGRAMDATA = os.environ.get('{ALLUSERSPROFILE}', r'C:\ProgramData')
SYSTEMDRIVE = os.environ.get('SYSTEMDRIVE', 'C:')
EMSISOFT_INSTALL_PATH = get_path_obj(f'{SYSTEMDRIVE}/EmsisoftCmd')
WHITELIST = '\n'.join((
str(CONEMU_EXE),
fr'{PROGRAMFILES_32}\TeamViewer\TeamViewer.exe',
@ -171,22 +189,17 @@ def build_menus(base_menus, title, presets) -> dict[str, ui.Menu]:
return menus
def update_scheduled_task() -> None:
"""Create (or update) scheduled task to start repairs."""
cmd = [
'schtasks', '/create', '/f',
'/sc', 'ONLOGON',
'/tn', f'{KIT_NAME_FULL}-AutoRepairs',
'/rl', 'HIGHEST',
'/tr', fr'C:\Windows\System32\cmd.exe "/C {sys.executable} {sys.argv[0]}"',
]
if IN_CONEMU:
cmd[-1] = f'{CONEMU_EXE} -run {sys.executable} {sys.argv[0]}'
run_program(cmd)
def end_session() -> None:
def end_session(menus: dict[str, ui.Menu]) -> None:
"""End Auto Repairs session."""
# Add last run marker
reg_set_value(
'HKCU',
fr'Software\{KIT_NAME_FULL}',
'AutoRepairsLastRun',
time.strftime('%Y-%m-%d'),
'SZ',
)
# Remove logon task
cmd = [
'schtasks', '/delete', '/f',
@ -218,10 +231,18 @@ def end_session() -> None:
except FileNotFoundError:
LOG.error('Ending repair session but session not started.')
try:
cmd = ['reg', 'delete', fr'HKCU\{AUTO_REPAIR_KEY}', '/f']
run_program(cmd)
except CalledProcessError:
LOG.error('Failed to remove Auto Repairs session settings')
reg_delete_value('HKCU', AUTO_REPAIR_KEY, 'Kill Explorer')
except FileNotFoundError:
# Ignore if not set
pass
for group in menus:
try:
cmd = ['reg', 'delete', fr'HKCU\{AUTO_REPAIR_KEY}\{group}', '/f']
run_program(cmd)
except CalledProcessError:
LOG.error(
'Failed to remove Auto Repairs session settings for group %s', group,
)
def get_entry_settings(group, name) -> dict[str, Any]:
@ -248,11 +269,15 @@ def init(menus, presets) -> None:
session_started = is_session_started()
# Check if autologon is needed
if not session_started and is_autologon_enabled():
LOG.warning('Skipping Autologon to preserve current settings.')
menus['Options'].options['Use Autologon']['Disabled'] = True
menus['Options'].options['Use Autologon']['Selected'] = False
reg_set_value('HKCU', AUTO_REPAIR_KEY, 'Use Autologon', 0, 'DWORD')
if not session_started:
if is_autologon_enabled():
LOG.warning('Skipping Autologon to preserve current settings.')
menus['Options'].options['Use Autologon']['Disabled'] = True
menus['Options'].options['Use Autologon']['Selected'] = False
reg_set_value('HKCU', AUTO_REPAIR_KEY, 'Use Autologon', 0, 'DWORD')
else:
# Deselect Autologon by default
menus['Options'].options['Use Autologon']['Selected'] = False
save_selection_settings(menus)
# Start new session
@ -274,6 +299,7 @@ def init_run(options) -> None:
update_scheduled_task()
if options['Kill Explorer']['Selected']:
atexit.register(start_explorer)
reg_set_value('HKCU', AUTO_REPAIR_KEY, 'Kill Explorer', 1, 'DWORD')
TRY_PRINT.run('Killing Explorer...', kill_explorer, msg_good='DONE')
if options['Use Autologon']['Selected'] and not is_autologon_enabled():
TRY_PRINT.run(
@ -318,7 +344,6 @@ def init_session(options) -> None:
download=True, msg_good='DONE',
)
print('')
reboot(30)
def is_autologon_enabled() -> bool:
@ -415,7 +440,7 @@ def run_auto_repairs(base_menus, presets) -> None:
show_main_menu(base_menus, menus, presets, title)
except SystemExit:
if ui.ask('End session?'):
end_session()
end_session(menus)
raise
# Start or resume repairs
@ -440,7 +465,7 @@ def run_auto_repairs(base_menus, presets) -> None:
ui.abort()
# Done
end_session()
end_session(menus)
ui.print_info('Done')
ui.pause('Press Enter to exit...')
@ -610,6 +635,20 @@ def update_main_menu(menus) -> None:
menus['Main'].options[name]['Display Name'] = display_name
def update_scheduled_task():
"""Create (or update) scheduled task to start repairs."""
cmd = [
'schtasks', '/create', '/f',
'/sc', 'ONLOGON',
'/tn', f'{KIT_NAME_FULL}-AutoRepairs',
'/rl', 'HIGHEST',
'/tr', fr'C:\Windows\System32\cmd.exe "/C {sys.executable} {sys.argv[0]}"',
]
if IN_CONEMU:
cmd[-1] = f'{CONEMU_EXE} -run {sys.executable} {sys.argv[0]}'
run_program(cmd)
# Auto Repairs: Wrapper Functions
def auto_adwcleaner(group, name) -> None:
"""Run AdwCleaner scan.
@ -681,6 +720,28 @@ def auto_chkdsk(group, name) -> None:
reboot()
def auto_disable_defender(group, name):
"""Open Windows Defender Threat Settings."""
result = TRY_PRINT.run(
'Open Windows Defender settings...',
open_defender_settings,
disable=True,
msg_good='Done',
)
save_settings(group, name, result=result)
def auto_enable_defender(group, name):
"""Open Windows Defender Threat Settings."""
result = TRY_PRINT.run(
'Open Windows Defender settings...',
open_defender_settings,
enable=True,
msg_good='Done',
)
save_settings(group, name, result=result)
def auto_disable_pending_renames(group, name) -> None:
"""Disable pending renames."""
result = TRY_PRINT.run(
@ -714,6 +775,21 @@ def auto_dism(group, name) -> None:
reboot()
def auto_emsisoft_cmd_run(group, name):
"""Run EmisoftCmd."""
TRY_PRINT.run('EmsisoftCmd (Install)...', install_emsisoft_cmd)
TRY_PRINT.run('EmsisoftCmd (Update)...', update_emsisoft_cmd)
result = TRY_PRINT.run('EmsisoftCmd (Scan)...', run_emsisoft_cmd_scan)
TRY_PRINT.run('EmsisoftCmd (Uninstall Service)...', delete_emsisoft_cmd_service)
save_settings(group, name, result=result)
def auto_emsisoft_cmd_uninstall(group, name):
"""Uninstall EmsisoftCmd."""
result = TRY_PRINT.run('EmsisoftCmd (Uninstall)...', uninstall_emsisoft_cmd)
save_settings(group, name, result=result)
def auto_enable_regback(group, name) -> None:
"""Enable RegBack."""
result = TRY_PRINT.run(
@ -724,6 +800,14 @@ def auto_enable_regback(group, name) -> None:
save_settings(group, name, result=result)
def auto_fix_file_associations(group, name):
"""Run Fix File Associations scan."""
result = TRY_PRINT.run(
'Fix File Associations...', fix_file_associations, msg_good='DONE',
)
save_settings(group, name, result=result)
def auto_hitmanpro(group, name) -> None:
"""Run HitmanPro scan."""
result = TRY_PRINT.run('HitmanPro...', run_hitmanpro, msg_good='DONE')
@ -736,6 +820,29 @@ def auto_kvrt(group, name) -> None:
save_settings(group, name, result=result)
def auto_mbam_install(group, name):
"""Install Malwarebytes."""
result = TRY_PRINT.run('Malwarebytes (Install)...', install_mbam)
save_settings(group, name, result=result)
def auto_mbam_run(group, name):
"""Run Malwarebytes.
save_settings() is called first since MBAM may kill this script.
"""
save_settings(group, name, done=True, failed=False, message='DONE')
result = TRY_PRINT.run('Malwarebytes (Run)...', run_mbam, msg_good='DONE')
ui.pause('Press Enter to continue...')
save_settings(group, name, result=result)
def auto_mbam_uninstall(group, name):
"""Uninstall Malwarebytes."""
result = TRY_PRINT.run('Malwarebytes (Uninstall)...', uninstall_mbam)
save_settings(group, name, result=result)
def auto_microsoft_defender(group, name) -> None:
"""Run Microsoft Defender scan."""
result = TRY_PRINT.run(
@ -755,6 +862,7 @@ def auto_remove_power_plan(group, name) -> None:
"""Remove custom power plan and set to Balanced."""
result = TRY_PRINT.run(
'Remove Custom Power Plan...', remove_custom_power_plan,
high_performance=True,
)
save_settings(group, name, result=result)
@ -983,11 +1091,61 @@ def backup_registry() -> None:
run_tool('ERUNT', 'ERUNT', backup_path, 'sysreg', 'curuser', 'otherusers')
def delete_emsisoft_cmd_service():
"""Delete EmsisoftCmd service."""
try:
stop_service('epp')
except GenericError:
pass
# Delete service
run_program(['sc', 'delete', 'epp'], check=False)
def delete_registry_null_keys() -> None:
"""Delete registry keys with embedded null characters."""
run_tool('RegDelNull', 'RegDelNull', '-s', '-y', download=True)
def fix_file_associations():
"""Fix file associations via registry edits."""
winaio_path = get_tool_path('WinRepairAIO', 'Repair_Windows').parent
winaio_path = winaio_path.joinpath(
f'Files/regfiles/file_associations/{OS_VERSION}',
)
for item in winaio_path.iterdir():
if item.suffix.lower() != '.reg':
continue
cmd = ['reg', 'import', str(item), f'/reg:{ARCH}']
run_program(cmd, check=False)
def install_emsisoft_cmd():
"""Install EmsisoftCmd."""
download_tool('EmsisoftCmd', 'EmsisoftCmd')
installer = get_tool_path('EmsisoftCmd', 'EmsisoftCmd')
extract_archive(installer, EMSISOFT_INSTALL_PATH, '-aos')
def install_mbam():
"""Install Malwarebytes."""
marker = set_local_storage_path('.', MBAM_PRESERVE_MARKER)
marker.unlink(missing_ok=True)
# Check for current installation
for path in ('ProgramW6432', 'PROGRAMFILES', 'PROGRAMFILES(X86)'):
if os.path.exists(f'{os.environ.get(path, "")}/{MBAM_EXE_PATH}'):
LOG.info('Previous Malwarebytes installation detected.')
marker.touch()
break
# Install / Upgrade
proc = run_tool(
'MBAM', 'MBAM', '/VERYSILENT', '/NORESTART', download=True, popen=True,
)
proc.wait()
def log_kvrt_results(log_path, report_path) -> None:
"""Parse KVRT report and log results in plain text."""
log_text = ''
@ -1058,6 +1216,41 @@ def run_bleachbit(cleaners, preview=True) -> None:
)
def run_emsisoft_cmd_scan():
"""Run EmsisoftCmd scan."""
log_path = format_log_path(
log_name='EmsisoftCmd', timestamp=True, tool=True,
)
log_path.parent.mkdir(parents=True, exist_ok=True)
quarantine_path = set_quarantine_path('EmsisoftCmd')
quarantine_path.mkdir(parents=True, exist_ok=True)
whitelist_path = log_path.with_suffix('.wl')
# Create whitelist
whitelist_path.write_text(WHITELIST, encoding='utf-8')
# Run Scan
cmd = [
f'{EMSISOFT_INSTALL_PATH}/a2cmd.exe',
fr'/files={PROGRAMDATA},{SYSTEMDRIVE}\Users',
'/archive', '/memory', '/ntfs', '/pup', '/traces',
f'/log={log_path}',
f'/quarantine={quarantine_path}',
f'/whitelist={whitelist_path}',
]
if IN_CONEMU:
cmd.extend(['-new_console:nb', '-new_console:s33V'])
run_program(cmd, check=False, pipe=False)
sleep(5)
set_proc_priority('a2cmd.exe', 'HIGH')
wait_for_procs('a2cmd.exe')
else:
proc = popen_program(cmd, priority=True)
sleep(5)
set_proc_priority('a2cmd.exe', 'HIGH')
proc.wait()
def run_bcuninstaller() -> None:
"""Run BCUninstaller."""
run_tool('BCUninstaller', 'BCUninstaller')
@ -1069,7 +1262,11 @@ def run_hitmanpro() -> None:
log_path = log_path.with_suffix('.xml')
log_path.parent.mkdir(parents=True, exist_ok=True)
cmd_args = ['/scanonly', f'/log={log_path}']
run_tool('HitmanPro', 'HitmanPro', *cmd_args, download=True)
proc = run_tool(
'HitmanPro', 'HitmanPro', *cmd_args,
download=True, popen=True, priority=True,
)
proc.wait()
def run_kvrt() -> None:
@ -1103,16 +1300,41 @@ def run_kvrt() -> None:
_f.write(f'"{kvrt_path}" {" ".join(cmd_args)}\n')
cmd = ('cmd', '/c', tmp_file, '-new_console:nb', '-new_console:s33V')
run_program(cmd, check=False)
sleep(1)
sleep(5)
set_proc_priority('KVRT', 'HIGH', exact=False)
wait_for_procs('KVRT.exe')
log_kvrt_results(log_path, report_path)
return
# Run in background
run_tool('KVRT', 'KVRT', *cmd_args, download=True)
proc = run_tool(
'KVRT', 'KVRT', *cmd_args,
download=True, popen=True, priority=True,
)
sleep(5)
set_proc_priority('KVRT', 'HIGH', exact=False)
proc.wait()
log_kvrt_results(log_path, report_path)
def run_mbam():
"""Run Malwarebytes."""
exe_path = None
# Get EXE path
for path in ('ProgramW6432', 'PROGRAMFILES'):
test_path = get_path_obj(f'{os.environ.get(path, "")}/{MBAM_EXE_PATH}')
if test_path.exists():
exe_path = str(test_path)
# Bail if MBAM not found
if not exe_path:
raise FileNotFoundError('MBAM not found')
# Run
run_program(exe_path, check=False)
def run_microsoft_defender(full=True) -> None:
"""Run Microsoft Defender scan."""
reg_key = r'Software\Microsoft\Windows Defender'
@ -1129,8 +1351,7 @@ def run_microsoft_defender(full=True) -> None:
# Get MS Defender status
## NOTE: disabled may be set to an int instead of bool
## This is fine because we're just checking if it's enabled.
disabled = bool(reg_read_value('HKLM', reg_key, 'DisableAntiSpyware'))
disabled = disabled or reg_read_value('HKLM', reg_key, 'DisableAntiVirus')
disabled = defender_is_disabled()
try:
passive_mode = reg_read_value('HKLM', reg_key, 'PassiveMode') == 2
except FileNotFoundError:
@ -1172,6 +1393,38 @@ def run_rkill() -> None:
run_tool('RKill', 'RKill', *cmd_args, download=True)
def uninstall_emsisoft_cmd():
"""Uninstall EmsisoftCmd."""
delete_folder(EMSISOFT_INSTALL_PATH, force=True, ignore_errors=True)
def uninstall_mbam():
"""Uninstall Malwarebytes."""
marker = set_local_storage_path('.', MBAM_PRESERVE_MARKER)
if marker.exists():
marker.unlink()
raise GenericWarning('Leaving existing MBAM installation in place.')
# Uninstall
install_path = reg_read_value('HKLM', MBAM_UNINSTALL_KEY, 'InstallLocation')
cmd = [
fr'{install_path}\mbuns.exe', '/Uninstall', '/VERYSILENT', '/NORESTART',
]
run_program(cmd)
def update_emsisoft_cmd():
"""Update EmsisoftCmd."""
cmd = [f'{EMSISOFT_INSTALL_PATH}/a2cmd.exe', '/update']
if IN_CONEMU:
cmd.extend(['-new_console:nb', '-new_console:s33V'])
run_program(cmd, check=False, pipe=False)
sleep(1)
wait_for_procs('a2cmd.exe')
else:
run_program(cmd, check=False)
# OS Built-in Functions
def create_custom_power_plan(enable_sleep=True, keep_display_on=False) -> None:
"""Create new power plan and set as active."""
@ -1293,6 +1546,63 @@ def kill_explorer() -> None:
run_program(cmd, check=False)
def open_defender_settings(disable=False, enable=False):
"""Open Windows Defender Threat Settings."""
enabled = None
# Check Registry if Defender is disabled
if defender_is_disabled():
raise GenericError('Defender is disabled.')
# Check WMIC if Defender is active
cmd = [
'WMIC', r'/namespace:\\root\SecurityCenter2',
'path', 'AntivirusProduct',
'where', 'displayName="Windows Defender"',
'get', 'productState', '/value',
]
try:
proc = run_program(cmd)
status = proc.stdout.split('=')[1]
enabled = bool(int(status) & MS_ANTIVIRUS_ENABLED)
except Exception:
# Unknown result, just show the prompt
pass
# Set prompt message
message = 'Please adjust Windows Defender settings as appropriate.'
if disable:
if enabled is False:
# Already disabled, just bail
return
message = 'Please disable realtime Windows Defender scanning.'
elif enable:
if enabled:
# Already enabled, just bail
return
message = 'Please enable realtime Windows Defender scanning.'
message += '\nPress OK to continue repairs.'
# Check Kill Explorer setting
cmd = ['start', '', 'windowsdefender://threatsettings']
kill_explorer_proc = False
try:
kill_explorer_proc = reg_read_value(
'HKCU', AUTO_REPAIR_KEY, 'Kill Explorer',
)
except FileNotFoundError:
# Ignore if not set
pass
if kill_explorer_proc:
# Explorer is needed to open the settings window, relaunch for now
start_explorer()
sleep(2)
run_program(cmd, check=False, shell=True)
show_alert_box(message=message, title='Windows Defender: Threat Settings')
if kill_explorer_proc:
kill_explorer()
def reboot(timeout=10) -> None:
"""Reboot the system."""
atexit.unregister(start_explorer)
@ -1494,6 +1804,11 @@ def run_sfc_scan() -> None:
raise OSError
def run_uninstallview() -> None:
"""Run UninstallView."""
run_tool('UninstallView', 'UninstallView')
def set_system_restore_size(size=8) -> None:
"""Set System Restore size."""
cmd = [

View file

@ -2,11 +2,13 @@
# vim: sts=2 sw=2 ts=2
import configparser
from datetime import datetime, timedelta
import logging
import json
import os
import re
import sys
import webbrowser
from typing import Any
@ -14,20 +16,23 @@ from wk.cfg.main import KIT_NAME_FULL
from wk.cfg.setup import (
BROWSER_PATHS,
DISABLED_ENTRIES_WINDOWS_11,
FAB_TIMEFRAME,
LIBREOFFICE_XCU_DATA,
REG_CHROME_UBLOCK_ORIGIN,
REG_WINDOWS_EXPLORER,
REG_OPEN_SHELL_SETTINGS,
REG_ESET_NOD32_SETTINGS,
REG_OPEN_SHELL_LOW_POWER_IDLE,
REG_OPEN_SHELL_SETTINGS,
REG_WINDOWS_EXPLORER,
UBLOCK_ORIGIN_URLS,
)
from wk.exe import kill_procs, run_program, popen_program
from wk.exe import get_procs, kill_procs, run_program, popen_program
from wk.io import case_insensitive_path, get_path_obj
from wk.kit.tools import (
ARCH,
extract_archive,
extract_tool,
find_kit_dir,
get_sdio_path,
get_tool_path,
run_tool,
)
@ -45,6 +50,7 @@ from wk.os.win import (
get_volume_usage,
is_activated,
is_secure_boot_enabled,
reg_read_value,
reg_set_value,
reg_write_settings,
stop_service,
@ -160,6 +166,44 @@ def build_menus(base_menus, title, presets) -> dict[str, ui.Menu]:
return menus
def check_if_auto_repairs_are_needed():
"""Check if Auto Repairs are needed based on last Fab run."""
try:
last_run = reg_read_value(
'HKCU', fr'Software\{KIT_NAME_FULL}', 'FabLastRun',
)
except FileNotFoundError:
# Assuming it isn't needed
return
fab_last_run = datetime.strptime(last_run, '%Y-%m-%d')
# Check if Auto Repairs was run after Fab
auto_repairs_last_run = None
try:
last_run = reg_read_value(
'HKCU', fr'Software\{KIT_NAME_FULL}', 'AutoRepairsLastRun',
)
auto_repairs_last_run = datetime.strptime(last_run, '%Y-%m-%d')
except FileNotFoundError:
# Assuming it wasn't
pass
# Check date(s) and prompt tech if necessary
if datetime.now() - fab_last_run < timedelta(days=FAB_TIMEFRAME):
if auto_repairs_last_run and auto_repairs_last_run >= fab_last_run:
# Auto Repairs shouldn't be needed
return
ui.print_warning('Fab was recently run, Auto Repairs may be needed.')
selection = ui.choice(
'Continue with Auto Setup, run Auto Repairs, or Quit?', ['C', 'R', 'Q'],
)
if selection == 'Q':
ui.abort()
if selection == 'R':
auto_repairs_script = find_kit_dir('Scripts').joinpath('auto_repairs.py')
os.execv(sys.executable, ['python', auto_repairs_script])
def check_os_and_set_menu_title(title) -> str:
"""Check OS version and update title for menus, returns str."""
color = None
@ -188,6 +232,9 @@ def check_os_and_set_menu_title(title) -> str:
def load_preset(menus, presets, title, enable_menu_exit=True) -> None:
"""Load menu settings from preset and ask selection question(s)."""
msp = False
# Menu exit entry
if not enable_menu_exit:
MENU_PRESETS.actions['Main Menu'].update({'Disabled':True, 'Hidden':True})
@ -212,8 +259,36 @@ def load_preset(menus, presets, title, enable_menu_exit=True) -> None:
ui.clear_screen()
ui.print_standard(f'{title}')
print('')
if selection[0] == 'Default' and ui.ask('Install LibreOffice?'):
menus['Install Software'].options['LibreOffice']['Selected'] = True
if selection[0] == 'Default':
# OpenShell
if OS_VERSION != 11 and ui.ask('Install OpenShell?'):
menus['Install Software'].options['Open-Shell']['Selected'] = True
menus['Configure System'].options['Open-Shell']['Selected'] = True
# LibreOffice
if ui.ask('Install LibreOffice?'):
menus['Install Software'].options['LibreOffice']['Selected'] = True
# Hiberboot & Hibernation
print('')
msg = 'Disable Fast Startup and enable Hibernation? (Recommended for SSDs)'
if ui.ask(msg):
for option in ('Disable Fast Startup', 'Enable Hibernation'):
menus['Configure System'].options[option]['Selected'] = True
# Apply ITS settings?
msp = ui.ask('Is this an ITS system?')
if msp:
option = 'Apply ITS Settings'
menus['Configure System'].options[option]['Selected'] = True
# ESET NOD32 AV
print('')
if msp or ui.ask('Install ESET NOD32 AV?'):
option = 'ESET NOD32 AV'
if msp or ui.ask(' For VIP?'):
option = f'{option} (MSP)'
menus['Install Software'].options[option]['Selected'] = True
# Re-enable Main Menu action if disabled
MENU_PRESETS.actions['Main Menu'].update({'Disabled':False, 'Hidden':False})
@ -238,6 +313,9 @@ def run_auto_setup(base_menus, presets) -> None:
# Check OS and update title for menus
title = check_os_and_set_menu_title(title)
# Check if AV scan needs to be run
check_if_auto_repairs_are_needed()
# Generate menus
menus = build_menus(base_menus, title, presets)
@ -371,6 +449,11 @@ def auto_enable_regback() -> None:
)
def auto_apply_its_settings():
"""Apply ITS settings."""
TRY_PRINT.run('Apply ITS settings...', apply_its_settings)
def auto_system_restore_enable() -> None:
"""Enable System Restore."""
cmd = [
@ -404,7 +487,6 @@ def auto_activate_windows() -> None:
def auto_config_browsers() -> None:
"""Configure Browsers."""
prompt = ' Press Enter to continue...'
TRY_PRINT.run('Chrome Notifications...', disable_chrome_notifications)
TRY_PRINT.run(
'uBlock Origin...', enable_ublock_origin, msg_good='STARTED',
)
@ -428,16 +510,49 @@ def auto_config_open_shell() -> None:
TRY_PRINT.run('Open Shell...', config_open_shell)
def auto_disable_chrome_notifications():
"""Disable Chrome notifications.
NOTE: This can cause Chrome Sync to be re-authenticated."""
TRY_PRINT.run('Disable Chrome Notifications...', disable_chrome_notifications)
def auto_disable_fast_startup():
"""Disable fast startup (i.e. Hiberboot)."""
TRY_PRINT.run(
'Disable Fast Startup...', reg_set_value, 'HKLM',
r'SYSTEM\CurrentControlSet\Control\Session Manager\Power',
'HiberbootEnabled', 0, 'DWORD',
)
def auto_disable_password_expiration() -> None:
"""Disable password expiration for all users."""
TRY_PRINT.run('Disable password expiration...', disable_password_expiration)
def auto_enable_hibernation():
"""Enable Hibernation."""
TRY_PRINT.run(
'Enable Hibernation...', run_program, ['powercfg', '/hibernate', 'on'],
)
def auto_export_aida64_report() -> None:
"""Export AIDA64 reports."""
TRY_PRINT.run('AIDA64 Report...', export_aida64_report)
def auto_install_eset_nod32_av():
"""Install ESET NOD32 AV."""
TRY_PRINT.run('ESET NOD32...', install_eset_nod32_av)
def auto_install_eset_nod32_av_msp():
"""Install ESET NOD32 AV with MSP settings."""
TRY_PRINT.run('ESET NOD32 (MSP)...', install_eset_nod32_av, msp=True)
def auto_install_firefox() -> None:
"""Install Firefox."""
TRY_PRINT.run('Firefox...', install_firefox)
@ -449,7 +564,10 @@ def auto_install_libreoffice() -> None:
NOTE: It is assumed that auto_install_vcredists() will be run
before this function to satisfy the vcredist=False usage.
"""
TRY_PRINT.run('LibreOffice...', install_libreoffice, vcredist=False)
TRY_PRINT.run(
'LibreOffice...', install_libreoffice,
use_mso_formats=True, vcredist=False,
)
def auto_install_open_shell() -> None:
@ -482,9 +600,9 @@ def auto_open_device_manager() -> None:
TRY_PRINT.run('Device Manager...', open_device_manager)
def auto_open_hwinfo_sensors() -> None:
"""Open HWiNFO Sensors."""
TRY_PRINT.run('HWiNFO Sensors...', open_hwinfo_sensors)
def auto_open_mic_and_webcam_tests():
"""Open Webcam Tests."""
TRY_PRINT.run('Webcam Tests...', open_mic_and_webcam_tests)
def auto_open_microsoft_store_updates() -> None:
@ -552,6 +670,11 @@ def auto_show_storage_status() -> None:
TRY_PRINT.run('Storage Status...', get_storage_status)
def auto_shutup_10():
"""Disable Windows telemetry using O&O ShutUp 10."""
TRY_PRINT.run('Disable Telemetry...', run_shutup_10)
def auto_windows_temp_fix() -> None:
"""Restore default ACLs for Windows\\Temp."""
TRY_PRINT.run(r'Windows\Temp fix...', fix_windows_temp)
@ -562,7 +685,12 @@ def config_explorer() -> None:
"""Configure Windows Explorer and restart the process."""
reg_write_settings(REG_WINDOWS_EXPLORER)
kill_procs('explorer.exe', force=True)
popen_program(['explorer.exe'])
popen_program([fr'{SYSTEMDRIVE}\Windows\explorer.exe'])
sleep(3)
for _ in range(30):
if get_procs('explorer.exe'):
break
sleep(1)
def config_open_shell() -> None:
@ -681,6 +809,20 @@ def fix_windows_temp() -> None:
# Install Functions
def install_eset_nod32_av(msp=False):
"""Install ESET NOD32 Antivirus."""
config_file = f'eset-config{"-msp" if msp else ""}.xml'
reg_write_settings(REG_ESET_NOD32_SETTINGS)
run_tool(
'ESET', 'ESET_NOD32_AV',
'--silent', '--accepteula',
'--msi-property', 'PRODUCTTYPE=eav',
'PRODUCT_LANG=1033', 'PRODUCT_LANG_CODE=en-US',
f'ADMINCFG="{config_file}"',
cwd=True, download=True,
)
def install_firefox() -> None:
"""Install Firefox.
@ -837,6 +979,11 @@ def uninstall_firefox() -> None:
# Misc Functions
def apply_its_settings():
"""Apply ITS settings."""
create_custom_power_plan(enable_sleep=False)
def check_secure_boot_status() -> None:
"""Check Secure Boot status."""
is_secure_boot_enabled(raise_exceptions=True, show_alert=True)
@ -924,20 +1071,11 @@ def open_device_manager() -> None:
popen_program(['mmc', 'devmgmt.msc'])
def open_hwinfo_sensors() -> None:
"""Open HWiNFO sensors."""
hwinfo_path = get_tool_path('HWiNFO', 'HWiNFO')
base_config = hwinfo_path.with_name('general.ini')
# Write new config to disk
with open(hwinfo_path.with_suffix('.ini'), 'w', encoding='utf-8') as _f:
_f.write(
f'{base_config.read_text(encoding="utf-8")}\n'
'SensorsOnly=1\nSummaryOnly=0\n'
)
# Open HWiNFO
run_tool('HWiNFO', 'HWiNFO', popen=True)
def open_mic_and_webcam_tests():
"""Open Webcam Tests."""
webbrowser.open('https://mictests.com/')
sleep(1)
webbrowser.open('http://webcamtests.com/')
def open_microsoft_store_updates() -> None:
@ -953,7 +1091,10 @@ def open_snappy_driver_installer_origin() -> None:
stop_service(svc)
if any([get_service_status(s) != 'stopped' for s in appid_services]):
raise GenericWarning('Failed to stop AppID services')
run_tool('SDIO', 'SDIO', cwd=True, pipe=True, popen=True)
sdio_path = get_sdio_path(interactive=False)
log_dir = format_log_path(tool=True).parent
cmd = [sdio_path, '-log_dir', log_dir]
popen_program(cmd, cwd=sdio_path.parent, pipe=True)
def open_windows_activation() -> None:
@ -969,7 +1110,12 @@ def open_windows_updates() -> None:
def open_xmplay() -> None:
"""Open XMPlay."""
sleep(2)
run_tool('XMPlay', 'XMPlay', 'music.7z', cwd=True, popen=True)
run_tool('XMPlay', 'XMPlay', 'music.m3u', cwd=True, popen=True)
def run_shutup_10():
"""Disable Windows telemetry using O&O ShutUp 10."""
run_tool('ShutUp10', 'OOSU10', '1201.cfg', '/quiet', cwd=True)
if __name__ == '__main__':

View file

@ -67,7 +67,7 @@ def fix_layout(
# Calculate constraints
avail_horizontal, avail_vertical = get_window_size()
avail_vertical -= layout['Current'].get('height', 0)
for group in ('Title', 'Info'):
for group in ('Title', 'Subtitle', 'Info'):
if not layout[group]['Panes']:
continue
avail_vertical -= layout[group].get('height', 0) + 1
@ -97,7 +97,7 @@ def fix_layout(
)
for group, data in layout.items():
num_panes = len(data['Panes'])
if num_panes < 2 or group not in ('Title', 'Info'):
if num_panes < 2 or group not in ('Title', 'Subtitle', 'Info'):
continue
pane_width, remainder = divmod(avail_horizontal - (num_panes-1), num_panes)
for pane_id in data['Panes']:

View file

@ -19,6 +19,7 @@ TMUX_SIDE_WIDTH = 21
TMUX_TITLE_HEIGHT = 2
TMUX_LAYOUT = { # NOTE: This needs to be in order from top to bottom
'Title': {'Panes': [], 'height': TMUX_TITLE_HEIGHT},
'Subtitle': {'Panes': [], 'height': TMUX_TITLE_HEIGHT},
'Info': {'Panes': []},
'Current': {'Panes': [environ.get('TMUX_PANE', None)]},
'Workers': {'Panes': []},
@ -115,6 +116,29 @@ class TUI():
# Add pane
self.layout['Title']['Panes'].append(tmux.split_window(**tmux_args))
def add_subtitle_pane(self, line1: str, line2: str) -> None:
"""Add pane to subtitle row."""
lines = [line1, line2]
tmux_args = {
'behind': True,
'lines': TMUX_TITLE_HEIGHT,
'target_id': None,
'text': '\n'.join(lines),
'vertical': True,
}
if self.layout['Subtitle']['Panes']:
tmux_args.update({
'behind': False,
'percent': 50,
'target_id': self.layout['Subtitle']['Panes'][-1],
'text': '\n'.join(lines),
'vertical': False,
})
tmux_args.pop('lines')
# Add pane
self.layout['Subtitle']['Panes'].append(tmux.split_window(**tmux_args))
def add_worker_pane(
self,
lines: int | None = None,
@ -221,6 +245,12 @@ class TUI():
self.layout['Info']['Panes'].clear()
tmux.kill_pane(*panes)
def remove_all_subtitle_panes(self) -> None:
"""Remove all subtitle panes and update layout."""
panes = self.layout['Subtitle']['Panes'].copy()
self.layout['Subtitle']['Panes'].clear()
tmux.kill_pane(*panes)
def remove_all_worker_panes(self) -> None:
"""Remove all worker panes and update layout."""
self.layout['Workers'].pop('height', None)
@ -242,6 +272,13 @@ class TUI():
self.layout['Title']['Panes'] = panes[:1]
self.set_title(line1, line2, colors)
def reset_subtitle_pane(self) -> None:
"""Remove all extra subtitle panes and update layout."""
panes = self.layout['Subtitle']['Panes'].copy()
if len(panes) > 1:
tmux.kill_pane(*panes[1:])
self.layout['Subtitle']['Panes'] = panes[:1]
def set_current_pane_height(self, height: int) -> None:
"""Set current pane height and update layout."""
self.layout['Current']['height'] = height
@ -323,7 +360,7 @@ def fix_layout(layout, forced: bool = False) -> None:
pass
# Update "group" panes widths
for group in ('Title', 'Info'):
for group in ('Title', 'Subtitle', 'Info'):
num_panes = len(layout[group]['Panes'])
if num_panes <= 1:
continue

View file

@ -81,9 +81,10 @@ function copy_live_env() {
rsync -aI "$ROOT_DIR/scripts/" "$PROFILE_DIR/airootfs/usr/local/bin/"
echo "Copying WizardKit UFD files..."
rsync -aI "$ROOT_DIR/setup/ufd/" "$PROFILE_DIR/airootfs/usr/share/WizardKit/"
rsync -aI --exclude="macOS-boot-icon.tar" "$ROOT_DIR/setup/ufd/" "$PROFILE_DIR/airootfs/usr/share/WizardKit/"
tar xaf "$ROOT_DIR/setup/ufd/macOS-boot-icon.tar" -C "$PROFILE_DIR/airootfs/usr/share/WizardKit"
cp "$ROOT_DIR/images/rEFInd.png" "$PROFILE_DIR/airootfs/usr/share/WizardKit/EFI/Boot/rEFInd.png"
cp "$ROOT_DIR/images/Syslinux.png" "$PROFILE_DIR/airootfs/usr/share/WizardKit/syslinux/syslinux.png"
cp "$ROOT_DIR/images/Syslinux.jpg" "$PROFILE_DIR/airootfs/usr/share/WizardKit/syslinux/syslinux.jpg"
echo "Copying Memtest86+ files..."
rsync -aI "/boot/memtest86+/memtest.bin" "$PROFILE_DIR/airootfs/usr/share/WizardKit/syslinux/"
@ -127,8 +128,7 @@ function update_live_env() {
label="${KIT_NAME_SHORT}_LINUX"
# Boot config
cp "$ROOT_DIR/images/Syslinux.png" "$PROFILE_DIR/syslinux/splash.png"
sed -i -r "s/___+/${KIT_NAME_FULL}/" "$PROFILE_DIR/airootfs/usr/share/WizardKit/syslinux/syslinux.cfg"
cp "$ROOT_DIR/images/Syslinux.jpg" "$PROFILE_DIR/syslinux/splash.jpg"
# MOTD
sed -i -r "s/KIT_NAME_SHORT/$KIT_NAME_SHORT/" "$PROFILE_DIR/profiledef.sh"
@ -196,7 +196,7 @@ function update_live_env() {
# Wallpaper
mkdir -p "$PROFILE_DIR/airootfs/usr/share/wallpaper"
cp "$ROOT_DIR/images/Linux.png" "$PROFILE_DIR/airootfs/usr/share/wallpaper/burned.in"
cp "$ROOT_DIR/images/Linux.jpg" "$PROFILE_DIR/airootfs/usr/share/wallpaper/burned.in"
# udevil
mkdir -p "$PROFILE_DIR/airootfs/media"

View file

@ -195,10 +195,10 @@ ln -s /Volumes/RAM_Disk/Logs "${WK_PATH}/var/root/Logs"
cp -a "${LINUX_DIR}/profile_base/airootfs/etc/skel/.tmux.conf" "${WK_PATH}/etc/tmux.conf"
rsync -aS /usr/bin/{env,killall} "${WK_PATH}/usr/bin"/
rsync -aS "${MACOS_DIR}/live-macos-startup" "${ROOT_DIR}/scripts/" "${WK_PATH}/usr/local/bin"/
if [[ -f "${ROOT_DIR}/images/macOS-${OS_VERSION:0:5}.png" ]]; then
cp -a "${ROOT_DIR}/images/macOS-${OS_VERSION:0:5}.png" "${WK_PATH}/usr/local/wallpaper.png"
if [[ -f "${ROOT_DIR}/images/macOS-${OS_VERSION:0:5}.jpg" ]]; then
cp -a "${ROOT_DIR}/images/macOS-${OS_VERSION:0:5}.jpg" "${WK_PATH}/usr/local/wallpaper.jpg"
else
cp -a "${ROOT_DIR}/images/macOS.png" "${WK_PATH}/usr/local/wallpaper.png"
cp -a "${ROOT_DIR}/images/macOS.jpg" "${WK_PATH}/usr/local/wallpaper.jpg"
fi
# Unbless

View file

@ -6,10 +6,6 @@
setlocal EnableDelayedExpansion
title WizardKit: Build Tool
call :CheckFlags %*
rem TODO: Remove warning
echo "Windows PE build is currently under development"
echo " Proceeding will likely result in errors so be warned"
pause
call :CheckElevation || goto Exit
call :FindKitsRoot || goto ErrorKitNotFound
@ -19,14 +15,8 @@ set "dandi_set_env=%adk_root%\Deployment Tools\DandISetEnv.bat"
if not exist "%dandi_set_env%" (goto ErrorKitNotFound)
call "%dandi_set_env%" || goto ErrorUnknown
:EnsureCRLF
rem Rewrite main.py using PowerShell to have CRLF/`r`n lineendings
set "script=%~dp0\.bin\Scripts\borrowed\set-eol.ps1"
set "main=%~dp0\.bin\Scripts\settings\main.py"
powershell -executionpolicy bypass -noprofile -file %script% -lineEnding win -file %main% || goto ErrorUnknown
:Launch
set "script=%~dp0\.bin\Scripts\build_pe.ps1"
set "script=%~dp0\pe\build_pe.ps1"
powershell -executionpolicy bypass -noprofile -file %script% || goto ErrorUnknown
goto Exit

View file

@ -30,7 +30,7 @@ rem robocopy /e windows/cbin %OUT_DIR%\.cbin
mkdir %OUT_DIR%\.cbin
copy ..\LICENSE.txt %OUT_DIR%\LICENSE.txt
copy ..\README.md %OUT_DIR%\README.md
copy ..\images\ConEmu.png %OUT_DIR%\.bin\ConEmu\
copy ..\images\ConEmu.jpg %OUT_DIR%\.bin\ConEmu\
attrib +h %OUT_DIR%\.bin >nul 2>&1
attrib +h %OUT_DIR%\.cbin >nul 2>&1

View file

@ -1 +1,7 @@
#Put SSH keys here
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAgEAhF5u/wn04dSDI1mg6HlbDhmM3orJtu2kZdOTBd+/kvCxdC4h+AuwRSWjbIhGi9s8R3iq64gC6TJ2dX4skJ5fMeYqHMZieGgfXderRiPgMURCDWONLZCWyowBun5qGaXkYQo5VbLUNGXua9+RMXaxoJSCOhxq/6CzdleD6pkNNgL5a1ZarD3wLCNRsS50OmyGytXsYTClAY+F9lTd4VXjKuZpjqGfhA5Xz09Rad3Me2Tsd07cdO3LxDNlr969Q/hEwfZ/g+ePaIO0Z/zFHIO4J6Mnt8POTU1fM99tgqUQHWZRP2A+9OYx7nApdA4IFWVUhNfsVkrgcgYdCLD8U16Cdfwm1i1RiBhlYBfzA+EDjD6cbegaaMCKhsCZMZKQB4LyJTDgjvCrk1Q7dE0Nc1Nq8qD/BMbZkIKQcQH8xrX1hONayUMdOPnpDpi6IP2NIYFTbdJD70JQ8ru+gIDRQJR6g0AwnjMoJYNRKgAtWlcbKQ8YQW/FNREtyUhh8tquCyFbofGUiJxmTbWki7u7VJxRLNSnp+NQhPNT4FUbWy1vPrJi0l3MxuXdG3nZ0Brnggn72tnGcAUOmRTPubNlkhFStqcCM+tAVTHeLwHobdMewKQMWGPt6UXLtEJINqW9nCh1SAOA3cjsZ3ugXLRQQc82rEgTfTp2RtuN+NSf/vgoDbk= 1201 PuTTY Key
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDGZqPA7/T3zw8YipngM6vKpxX+IMpwqm2jad+NcJWxC0Hh09oVUalgbO/eWRloQlNgxHTosdIkSp++xnyeEHI3vL0pbko/c0OJbs6vEsHp8ljzt61HKKsscVADCI/ogGwHkPIHENgbiXkBPutEBLYFPtMcJQw6GBIkagW+dTyqEw/8c1cDmTq7AM74tHqgrpYjJy35Nne0K+zGIeqzTJdtg3fkRCN9JH24c3VbYoeIpMlgfxxgRG44DC/o0BRoMr3wWiS/sTrutlluB03vaQWe+4o8p789wq+fDqKhBTisH96RQ1Y1D5eZcf0DngBJtnCLWPG+z6YP0DFW5DYeQRoYNneRkR10RUqN0Eufok/UMNnxWcW+TztTxO5JSucXt0MYpLsWO1U7B22MR1W7oVlbznUrVENSQGRqyOS4PdqmI4faF0vEKis68S7NaXg88zwBr612HwFBianXvvxhkyEKv8ECbeXSvHcIajepdzbGLwaussDQiNv8vyX/8o3K7Si/ktdgIK4UzfaMq7G0vX1KEvuKAfMPYn4z0zuc/ahxTTfvHqfO+cnYgH8Pnzi1DGziRveeKIFT4OKOP5C3wHntsfv1CStK/LXhH3j4PNRuet0Fm5+jUJ22DQqlXtFiwFz4E+Bt+67exhm4Out4rAUqCzjDW5+mw0WU2P7u01cT+Q== admin@anaconda.1201.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDaJkYcxi7eSpRE7i0n2N2q4CHebPqxYc5eLQ2mDbrLpAIRUSdVjqe8RiVLJ5LKejkGMnWbaiDZ59cLWJhDTfqZFCRexVQkA9v8MVHUWINzxqfJFOnz7dKXP0PmggDbuKMIUkY65KtOLC2Cnqs3epmysQxrSf33W3IqPwL2XjJQXRbFLd4UG1bSZtBAAF3C/i7hBzb2iQPIpr1v1rCrW6gVhrgyoN7ZTfMqcKHnTPsUn95Qtyp6NUYKh4ctrPmTcTHFfwmgQiAYQ6jMcH8bNBf1XDmJuEIwaILYVzzrWOXlx84rqaEUdeRbvd4S/G9FcRt9eO3o+jD4hupdyvIDCttP3ct6yeWQVotreZE/5OVwfxr0BNXPBmTiyF2c6cRrMlXpQMoRQyjnD5Eua0VEUJzj2ows5APGmciJudDw4rXoRLOZRX/nDuXqgNJJ6q+MgRx3hor/etbV2mXcmSMdoI8DuybFzHuEb9GRwYhLxzDdDe+zmevx0rl01W8EJImqgrTwMblADbM4VHpC974d5w2s9uoXJg1NY4UVkSjJdK0De0kyGh8hK2pqTqCBh1OznB43Yla5PwM+05JIMySVRuivvZ1+tBh8ZURzIbFFIrdgNiZIooI4hA/m8qz4CTWIxKWstXR08eOufIbjV+R6VJjEssvLmgYw93rUJ4WbQNbaiw== twoshirt@anaconda.1201.com
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDKjMOQl/re3sTBUFeNEYOt2DsZLEeQiFfzu1tFlMUGcLnpjpA/Zhp0qpBBVhFS9j8p7s1838v+HS5dN1yLhWjjdM7EbzIwczJTe83D52GPwOisVWyL6cdB++bynl6LQRGe/dZu19uO1nX3sVU8gime4KLMasihCWw4XATQC1fFB6CnTu62ps3jO1n1MnjsX4odjC/Und5xD39trGU5aO4l17Zns+OBCLwsERofvkb02XZaqmcAXie+/o3jS43dANJXhtsqk0dRiNONccsnshFP90ujR8mPQU1h15fppwI/mRJ4GwNkA7XMcHghj/KqOIptSf0w8bBBQ7RTJATG0nPw45BJHu1bHZEbECpHBbM6TIIKgYVm7cJs54kf0yN66UWzDOfzqjL8Mo/Gmu/bHKhCg+gEQg4xFKbBtB8adMCrj8q9JZ2x8a9l9wcUKpSN8DM4SWUP4F4uXe0cAHhrMIAOfCFcX1lBsilNxidE5fZUGW3WJJ3+WUkeWnfifEBDZpSV0BCWjHKz1R/tQeJfBS8sjjGSheIJZBxLYc+6IUdL77Zjy2byzQ7m4PfaMDI3CxXhkhEeC4AnCn6/quRLFuChrvRYLC9UDrrmMMB4xo4SGsWKnM83orD1UbtbsqfJaHLBGF3WgII77uDvmUnwZJmaHCYM4N97lkoqNgC4VAEd4Q== twoshirt@dinraal.2shirt.work
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDa9lUItn9ooNu2FrOUMHytoQlAtH0x+tcszmt0ZNZN6DU6H87bFtZcB3gaanU4Kr3mIaJBUSjgbafJHiiYXvbzt+Gx7iQxAsXQkOfzArKHu9WV5OIHBATtONI3pokF3crlHJVR7hjY1lvP07c+F/Oygt0Hjd2RcslxPjqSVBRTl6z8Yu7r/BbkNiZRJfuJW/hNg+tGYRFHM6uy0qZ3fOwUmQ+MqCXm3V9K0A/e8dNyHEkW2v4CuAW8QP7gjA4nT/jrkJAA98firwSJdMgpZIFSuzf48D/AhDGuE55W5m/ItpMjVO7oDvqrEygyMO1ugxrIVqj7EM3HtArOtsMDueyCcTd5tWs/e80Y7/E4iB4bQQGo9ifA9oPqywAfETqvO0VUtjO9cMt7/Xnhc9qLxwKstr9UX9ORFm8hiaq9jVPkbwpmBIdfBpk4YwbY/1ObRQmOgsIuq5otPMrw17ymrJCagxk74BAOiMoUte5fhBezMl0ZlsBA9yWw63PHchWCyXQ0o195A3e04Api2FYx2er3mA28vhj8WkXwsuF1C2nypztn0GlmVoDKK5Z//slefLWAYq+V7AyGW3x2zYi4WpBiyM+FmG4ABVw5alxJjkvsoC1Ho7kKjQAdARhy+HsveSYLPPaSsnFIexpTjPlNlSquZG2rXxWLquo40CMMbRdJbw== twoshirt@farosh
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCh+EGFqMfJmfOQvfqfv/ilDL80krdZNdBvJ8xFWYMRy8z4z1Ih7BlCfkGObyxKLIYJgkPPhN3xLWWpN78ME7YeeUF1Ly84oIJABvK9CuZPDcUwDhpLoBli/qxoF/YyLufqtECKaQpDWt+iB1522XcVUerRFMGX3brE+b49gmXSuCC0lPijqcWV9KZVNKj9EStgY5b4DTjINOoiHIHBFsov37wt/+qJn7th+EDqcPndIcTQ31VbcGqEWtfNQWPGVmH898Q2XLvCbN+seBK9ZmttcXzWlS70qUr4xHrZCnegwMnBKPQ0sVo7NtC5DQHrN4I4NyvY0fr/o16nIphfaNZgy/CDo1WauBjJlbQ9MRcFVSPhL3LeyiBtBwC6Nr/qR+6Xjf/BV0ybw8MjXukZxKfW9xJsL631Xrk1/oYJnNKL5IyhIsVFRtfwcB4YfPEZbrdBxrse0Ypchgvpl5srTQfEL5ZTf/ozWCUST2Bf+dDMYrdqudg5zhPU6prneaEzlBxiLqGwBId9bzIqqHD+fE4a90oOX/WpZW0PFApnXGkPahaTPHGOAMfM+DmXdr2e5emdRZp+wgZU1EXwUzKVwE4fnj6HhuUlAt18LBZ/WLHMDGryuKemW0z9X9CUhzgkAmzgRCJ09ZXLYcwuyLwv9HnMQUa6RlWK69s3T/m+Y8fzKQ== twoshirt@mipha.2shirt.work
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC7MHLxoozeHOmFpjIGaXi8m0LuHZb4eUjX6x50XUlP81oVHbl4iAqw/N4r4j+Lg+lga7xcTeBMNWsa/tGxYkAfF8TP8M0S8XEMOR04r9iA4V6wQ8nGhv99y24NZMJPfiseNjDEwoPYPP5+zpCNfvxeMXxz3EhLFwzSp1dz+f1tBcDd8OtxDAGPn1cIM4Ms9gmIv3/HxOinW4IHxEbsZUWtKGPumsuIYwObfBYZPK0WtK23LPYqtReLYbzQmsf5SPpJAx20mwtZm8Y+LBXAKuxWEKzlF4l/ubqjTfMff5t+8FPEyCgRwm8VcMqxA1b04Pkcuq08AuooJuLKHOJ+aSyDWGXrSf3RlUAx8GafYOpZrcMEhQ0Q1a0XqZNTUXrf13qVPBqnKV8asOXrYIP56Z3zp8qoHasT8t5PbYrwvtV7weW/X61cQf/nn1B/BJbJr/rrOOxdqRCsH44OlElrhjwHsuzQbMc4U4wwoazlMmfNKsKUaoBmLPDTfmMBwnCuBrngNY9JsSB778fqwxsyLSfDTcIDW2kGuQ4P/4u5cKNw/q8Zo15Ghw2327kyTK9e4EGPCpBk+s5832FWS0uJLV269R5aZ5dYzYU13djfVOw2ypZTdr55nTlIH/31iSmJS0PBKyRLa2a7YxErt37W3f2U1eUt+j91LeaP5cMKHkWAsw== twoshirt@naydra.2shirt.work

View file

@ -1,3 +1,3 @@
# Put known WiFi networks in the form:
#SSID-5G:::Password
#SSID-2G:::hunter2
1201computersXI:::wifipassword
1201computersXI-5g:::wifipassword

View file

@ -1,14 +1,12 @@
aic94xx-firmware
ddrescueview-bin
hardinfo-gtk3
hfsprogs
iwgtk
memtest86-efi
mprime-bin
opensuperclone-git
pipes.sh
python-mariadb-connector
python-smbus2
smartmontools-svn
ttf-font-awesome-4
udevil
wd719x-firmware
wimboot-bin

View file

@ -1,4 +1,5 @@
aic94xx-firmware
adobe-source-han-sans-otc-fonts
adobe-source-sans-fonts
alsa-utils
amd-ucode
antiword
@ -8,12 +9,9 @@ arch-install-scripts
base
bc
bind
bluez
bluez-utils
bolt
btrfs-progs
cbatticon
chntpw
cmatrix
colordiff
conky
@ -25,6 +23,7 @@ ddrescueview-bin
device-mapper
diffutils
dkms
dmde
dmidecode
dmraid
dos2unix
@ -39,16 +38,12 @@ f2fs-tools
fatresize
feh
ffmpeg
firefox
foot-terminfo
gnome-keyring
gnu-netcat
gparted
gpicview
gptfdisk
grub
gsmartcontrol
hardinfo-gtk3
hexedit
hfsprogs
htop
@ -70,12 +65,14 @@ libxft
linux
linux-firmware
linux-firmware-marvell
linux-headers
lm_sensors
lsscsi
lvm2
lzip
man-db
man-pages
mariadb-clients
mdadm
mediainfo
memtest86-efi
@ -92,32 +89,35 @@ nano
nbd
ncdu
ndisc6
netsurf
nfs-utils
nmap
noto-fonts
noto-fonts-cjk
ntfs-3g
numlockx
nvme-cli
open-iscsi
openbox
openssh
opensuperclone-git
otf-font-awesome-4
p7zip
papirus-icon-theme
parted
pcmanfm
perl
picom
pipes.sh
pv
python
python-docopt
python-mariadb-connector
python-matplotlib
python-packaging
python-prompt_toolkit
python-psutil
python-pytz
python-requests
qemu-guest-agent
ranger
refind
reiserfsprogs
rfkill
@ -127,10 +127,10 @@ rxvt-unicode
rxvt-unicode-terminfo
sdparm
smartmontools-svn
smbclient
sof-firmware
speedtest-cli
spice-vdagent
squashfs-tools
st
sudo
sysbench
@ -141,7 +141,6 @@ systemd-sysvcompat
terminus-font
testdisk
texinfo
thunar
tigervnc
tint2
tk
@ -162,12 +161,9 @@ usb_modeswitch
usbmuxd
usbutils
util-linux
veracrypt
vim
virtualbox-guest-utils
volumeicon
wd719x-firmware
wezterm-terminfo
which
wimboot-bin
wimlib
@ -176,7 +172,6 @@ xarchiver
xf86-input-libinput
xf86-video-amdgpu
xf86-video-fbdev
xf86-video-nouveau
xf86-video-qxl
xf86-video-vesa
xfsprogs

View file

@ -0,0 +1,27 @@
pkgname=dmde
pkgver=4.0.6.806
pkgrel=1
pkgdesc="DMDE is a powerful tool for data searching, editing, and recovery on disks"
arch=('x86_64')
url="https://dmde.com/"
license=('custom')
makedepends=(unzip)
replaces=($pkgname)
source=("dmde-mine.ini")
source_x86_64=("https://dmde.com/download/dmde-4-0-6-806-lin64-gui.zip")
sha512sums=('1f11bee45672f507c4401031811273e8d6b103358bd0b2bec1cd6ecca1782ec23c0af3f81c23c5fcedd4380169fdea0eab60909ce59e17053029608ba324586a')
sha512sums_x86_64=('b2d20d13ced8780baa46a435c772af16b7b16b38c7daf65d2edc55f3560bb2ab417390ffd55cea6f424d4237ff911baa5547a45a9c9e279689fb1fd8fb82fc99')
package() {
cd $srcdir
mkdir -p ./usr/share/dmde/ $pkgdir/usr/bin/ $pkgdir/usr/share/applications/ $pkgdir/usr/share/pixmaps/
unzip ./dmde-4-0-6-806-lin64-gui.zip -d $srcdir/usr/share/dmde/
cp $srcdir/dmde-mine.ini $srcdir/usr/share/dmde/dmde.ini
cp -r usr $pkgdir
chmod +x $pkgdir/usr/share/dmde/dmde
chmod +x $pkgdir/usr/share/dmde/dmde-su
ln -sr /usr/share/dmde/dmde $pkgdir/usr/bin/dmde
ln -sr /usr/share/dmde/dmde-su $pkgdir/usr/bin/dmde-su
}

View file

@ -0,0 +1,482 @@
;
;dmde.ini - DMDE for Linux Initialization File
;
setupsign=5e440968
lickey=
activatekey[0]=
portablekey=
activatedev=
lngfile=\en
;interface language file
loadlngfiles=%appres%/locals/*.lng
;load language files
loadcptables=%appres%/locals/*.tbl
;load code page tables for Unicode-Char,Translit,Upcase conversions
editortemplates=%appres%/template.txt
;editor template file(s) - wildcards are possible
[CONSOLE]
autosizemaxy=
autosizemaxx=
[GUI]
mainwndpos=
;x,y,cx,cy
dialogfontsize=
;dialogfont=
;scale percents:
dialogwidth=100
dialogheight=100
;editorfont=
editorfontsize=
;editorfontbold=0
;previewfiles=*.bmp;*.gif;*.ico;*.jfif;*.jpe;*.jpeg;*.jpg;*.png;*.tif;*.tiff
[COMMON]
mainwndsplit=-1
;usecodepage=1252
;manually select used code page (CP)
;oemcodepage=850
;manually select source OEM CP for DOS names
applylngcodepage=1
;=1: use codepages from the lng file
translitenable=1
;=1: transliterate symbols outside current code page
viewtranslit=0
;=1: transliterate symbols on the screen
rtlapply=0
;=1: use rtl ui for right-to-left languages
rtldismiss=0
;=1: turn off rtl string mirroring if terminal already supports it
shellopen=xdg-open
stephints=0
;=1: activate step-by-step hints
;=0: deactivate step-by-step hints
popuphints=
;=1: activate popup hints (mouse over)
;=0: deactivate popup hints (mouse over)
kilobyte=1000
;kilobyte=1024
displayCHS=0
editorhexcolsnum=16
;editorhexcolsnum=N - maximum columns number for hex editor
;editorhexcolsnum=0: auto
editorhexgroupsize=8
startup=p
;startup=p - open physical drives at startup
;startupimage=filename - open disk image
;startupdev=devicestring - open device at startup
;startupraid=raid.ini - load RAID from "raid.ini" at startup
;startupcopy=copy.ini - load "Copy sectors" from "copy.ini" at startup
readonly=0
;=1 - globally disable writing to devices
devopen_editmode=0
;=1 - default edit mode when open using dialog box
devload_editmode=0
;=1 - default edit mode when load from log-file
devapply_ioparamsopt=0
;=1 - option to change i/o params when applying changes
devapply_editmodeopt=0
;=1 - option to set edit mode when applying changes
partapply_ioparamsopt=1
;=1 - option to change i/o params when applying partitioning changes
partapply_editmodeopt=1
;=1 - option to set edit mode when applying partitioning changes
queryclosedevice=1
;query when closing device
showpartitions=1
;show partitions when open device
;editmode=1
;enable disk editor edit mode by default
;Redefine default device enumeration:
;Linux device enumeration by FindFile:
;enumdevs0=0,"/dev/fd*",0,"",""
;enumdevs1=0,"/dev/sd?",0,"",""
;enumdevs2=0,"/dev/hd?",0,"",""
;enumdevs3=0,"/dev/ub?",0,"",""
;enumdevs4=0,"/dev/md*",0,"",""
;enumdevs5=0,"/dev/scd*",0,"",""
;include /dev/disks/by-id & /dev/disks/path enumeration:
;enumdevs_byid=1
;devusbdetectex=
ckeventtick=1
;ckeventtick=0 check event every time (slow down operations)
;ckeventtick=1 check event every 55ms only
mousehandler=1
;mousehandler=0 - no mouse
;mousehandler=1 - use mouse
inet=2
;1:read hosts file and access DNS servers
;2:use getaddrinfo function for internet connections
[IO]
;deviopopupontry=3
;additional tries num. before displaying i/o dialog box when errors are auto ignored
deviopopupdelay=2000
;additional ms delay before displaying i/o dialog box when errors are auto ignored
queryioerrors=1
querydrivenotready=1
retries=1
;retries=N
; read/write retries number for sector with errors (N=0..999)
; if N=0 read block only once (the rest of the block after error is zeroed)
seekretries=1
;seekretries=N - read/write auto retries number if sector not found (N=0..64)
deviojump=0
;deviojump=N
;jump over N sectors after I/O error
deviojumpreturn=0
;deviojumpreturn=1 - reverse read after jump
;deviojumpreturn=0 - do not reverse read
devioskipfiller=0x50494B53
;fill skipped sectors with hex values
deviobadfiller=0x20444142
;deviobadfiller=0x20444142 - fill bad sectors with hex values
;deviobadfiller= - do not fill bads
buffer=131072
;buffer=N - disk data transfer block size (N=4096..1048576)
dblbuffer=2097152
;dblbuffer=N -
;(N=4096..16777216)
diskcache=16777216
;diskcache=N - disk cache size
;(N=4096..33554432)
;diskmaxmodsize=209715200
;max size for pending modifications
devreset_chkserial=1
;check device serial number when resetting handle
devreset_trynewdevs=1
;devreset_trynewdevs=0 ;never try different device names
;devreset_trynewdevs=1 ;try different names when needed and serial can be checked
;devreset_trynewdevs=2 ;always try different names (not recommended)
devlistresetonerror=0
;devlistresetonerror=1 ;Update the list of devices on a device i/o error
vhd_writeenabled=0
;vhd_writeenabled=1 ;enable partial write support for virtual disk image files (vhd/vmdk/etc.)
[DR]
maxrecoverdepth=1024
maxfilerenames=16
maxdirrenames=16
splitfilesize=0
[FullScan]
showvolumesnum=2048
[FAT]
fatdirentryaccept=1
;FAT directory entry validation level:
;fatdirentryaccept=0 - accept reliable entries within reliable sectors only
;fatdirentryaccept=1 - accept any entries within reliable sectors
;fatdirentryaccept=2 - accept reliable entries within any sector
;fatdirentryaccept=3 - accept any entry within any sector
fatinvdirtotree=0
;fatinvdirtotree=0 - add FAT invalid directories to file panel only
;fatinvdirtotree=1 - insert FAT invalid directories into tree also
fatfoundtoroot=1
;fatfoundtoroot=0 - add found root subdirs to a common directory list
;fatfoundtoroot=1 - insert found root subdirectories into $Root
volumeseachblock=4194304
;blocksize for FAT/NTFS volume search
fatmaxvolumes=1024
[NTFSSearch]
ntfsmaxvolumes=1024
ntfsmaxprocstarts=1024
ntfsmaxmftruns=0xffffff
ntfsmaxprocmftruns=32768
ntfsmaxindxrecs=0
;ntfsthoroughsearch=0 - may skip small inserted MFT fragments
;ntfsthoroughsearch=1 - more thorough NTFS Search
ntfsthoroughsearch=1
;ntfsmftshift=0 - process sector aligned MFT records only
;ntfsmftshift=N - process MFT shifted by multiple of N bytes (shifted, traced, etc.)
ntfsmftshift=1
;ntfsrestrunlen=N - small MFT runs (N or less records) to be partially processed only
ntfsrestrunlen=4
[IFACE]
filecachesize=32768
;max. number of cached file panel items
maxtreechilditems=2048
;max child items number displayed in tree (GUI)
charclustermap=]xR./=><<!x|[
;console UI:
dlgframe=1
dlglistframe=0
;console chars:
charraidbtns=+,30,x,^,v,*
charmarks=<>x*\u25BC\x20\x20
charbtnshadow=\x20\x20\x20
charwframe=\u250C\u2500\u2510\u2502\u2502\u2514\u2500\u2518
charframe=\u250C\u2500\u2510\u2502\u2502\u2514\u2500\u2518
charvscroll=\u25B2\u25BC\u2592\u25A0
charhscroll=<>\u2592\u25A0
chartree=\u251C\u2514
charprogress=\u2588\u2592
; remove "#" to use color scheme
editorcolors#=\ ;color scheme
1F,\ ;0 Default
1B,\ ;1 Caption
0F,\ ;2 Focused
70,\ ;3 Selected block
0F,\ ;4 Selected object
0E,\ ;5 Modified
1A,\ ;6 Read Error
1A,\ ;7 Title
1C,\ ;8 Invalid Value
03,\ ;9 selected input
07,\ ;10 grayed
1B,\ ;11 selected not focused
1A,\ ;12 Caption Raid Disk #1
17,\ ;13 Caption Raid Disk #2
1C ;14 Invalid Input
editorcolors#=\ ;gray scheme
8F,\ ;0 Default
8B,\ ;1 Caption
0F,\ ;2 Focused
70,\ ;3 Selected block
0F,\ ;4 Selected object
0E,\ ;5 Modified
8A,\ ;6 Read Error
8A,\ ;7 Title
8C,\ ;8 Invalid Value
03,\ ;9 selected input
07,\ ;10 grayed
8B,\ ;11 selected not focused
81,\ ;12 Caption Raid Disk #1
82,\ ;13 Caption Raid Disk #2
8C ;14 Invalid Input
editorcolors#=\ ;blue scheme
1B,\ ;0 Default
1E,\ ;1 Caption
3F,\ ;2 Focused
30,\ ;3 Selected block
0F,\ ;4 Selected object
0E,\ ;5 Modified
1A,\ ;6 Read Error
1A,\ ;7 Title
1C,\ ;8 Invalid Value
3F,\ ;9 selected input
07,\ ;10 grayed
1F,\ ;11 selected not focused
1A,\ ;12 Caption Raid Disk #1
17,\ ;13 Caption Raid Disk #2
1C ;14 Invalid Input
;console text attributes:
; xxxx:
; x... - text background color for shortcut
; .x.. - text color for shortcut
; ..x. - text background color
; ...x - text color
; 0=Black 1=Blue 2=Green 3=Cyan 4=Red 5=Magenta 6=Brown 7=ltGray
; 8=dkGray 9=ltBlue A=ltGreen B=ltCyan C=ltRed D=ltMagenta E=Yellow F=White
; remove "#" to use color scheme
colors#=\ ;color scheme
3E30,\ ;menubox
3E30,\ ;menubar
0E0E,\ ;highlighted menu item
3838,\ ;disabled menu item
2E20,\ ;button
2828,\ ;disabled button
2E2F,\ ;focused button
2E2B,\ ;default button
0030,\ ;list item
002F,\ ;focused list item
003F,\ ;selected list item
003E,\ ;marked list item
002E,\ ;marked focused list item
002F,\ ;active dialog caption
002F,\ ;not active dialog caption
001F,\ ;input
003F,\ ;input selection
0078,\ ;disabled input
00FE,\ ;modified input
0013,\ ;scrollbar
3E30,\ ;cluster
3F3F,\ ;cluster highlighted
7878,\ ;cluster disabled
001F,\ ;active window frame
0017,\ ;not active window frame
001F,\ ;active window title
0017,\ ;not active window title
001E,\ ;column title
1E1F,\ ;item in window
002F,\ ;focused item in window
001A,\ ;selected item in window
001E,\ ;marked item in window
003E,\ ;focused marked item in window
3E30,\ ;status line
7E70,\ ;dialog box text
3F3B,\ ;dialog column header
1F1E,\ ;window column header
0071,\ ;group/tab frame color
1E1F,\ ;window button
1818,\ ;window disabled button
2E2F,\ ;window focused button
1E1A,\ ;window default button
1E1F,\ ;window cluster
1E1F,\ ;window cluster highlighted
1818 ;window cluster disabled
colors#=\ ;gray scheme
7470,\ ;menubox
F4F0,\ ;menubar
040F,\ ;highlighted menu item
7878,\ ;disabled menu item
F4F0,\ ;button
F7F7,\ ;disabled button
F4F0,\ ;focused button
F4F0,\ ;default button
008F,\ ;list item
000F,\ ;focused list item
008B,\ ;selected list item
008E,\ ;marked list item
000E,\ ;marked focused list item
00F0,\ ;active dialog caption
00F8,\ ;not active dialog caption
008F,\ ;input
0080,\ ;input selection
0078,\ ;disabled input
008E,\ ;modified input
008F,\ ;scrollbar
7470,\ ;cluster
7470,\ ;cluster highlighted
7878,\ ;cluster disabled
008F,\ ;active window frame
008F,\ ;not active window frame
008F,\ ;active window title
008F,\ ;not active window title
008B,\ ;column title
8B8F,\ ;item in window
000F,\ ;focused item in window
008B,\ ;selected item in window
008E,\ ;marked item in window
000E,\ ;focused marked item in window
0070,\ ;status line
7470,\ ;dialog box text
8F8B,\ ;dialog column header
8F8B,\ ;window column header
0070,\ ;group/tab frame color
8E8F,\ ;window button
8787,\ ;window disabled button
0E0F,\ ;window focused button
8E8B,\ ;window default button
8E8F,\ ;window cluster
8E8F,\ ;window cluster highlighted
8787 ;window cluster disabled
colors#=\ ;blue scheme
3F30,\ ;menubox
3F30,\ ;menubar
0F0F,\ ;highlighted menu item
3838,\ ;disabled menu item
7470,\ ;button
7878,\ ;disabled button
3F3F,\ ;focused button
3F3F,\ ;default button
001B,\ ;list item
003F,\ ;focused list item
001F,\ ;selected list item
001E,\ ;marked list item
003E,\ ;marked focused list item
003F,\ ;active dialog caption
003F,\ ;not active dialog caption
001F,\ ;input
003F,\ ;input selection
0078,\ ;disabled input
00FE,\ ;modified input
001F,\ ;scrollbar
7470,\ ;cluster
7470,\ ;cluster highlighted
7878,\ ;cluster disabled
001B,\ ;active window frame
001B,\ ;not active window frame
001F,\ ;active window title
001B,\ ;not active window title
001E,\ ;column title
1E1B,\ ;item in window
003F,\ ;focused item in window
001F,\ ;selected item in window
001E,\ ;marked item in window
003E,\ ;focused marked item in window
0030,\ ;status line
7470,\ ;dialog box text
1B1E,\ ;dialog column header
1F1E,\ ;window column header
0073,\ ;group/tab frame color
1E1B,\ ;window button
1818,\ ;window disabled button
3F3F,\ ;window focused button
1E1F,\ ;window default button
1E1B,\ ;window cluster
1E1B,\ ;window cluster highlighted
1818 ;window cluster disabled

View file

@ -47,7 +47,7 @@ prepare() {
patch --directory="$_sourcedir" <"$srcdir/$(basename ${file})"
fi
done
sed 's/Liberation Mono/Hack/;s/float alpha = 0.8;/float alpha = 0.85;/' "$_sourcedir/config.def.h" > "$_sourcedir/config.h"
sed 's/Liberation Mono/Hack/;s/float alpha = 0.8;/float alpha = 0.55;/' "$_sourcedir/config.def.h" > "$_sourcedir/config.h"
# This package provides a mechanism to provide a custom config.h. Multiple
# configuration states are determined by the presence of two files in

View file

@ -15,21 +15,18 @@ syslinux
tigervnc
wpa_supplicant
# hardinfo-gtk3 / opensuperclone-git
cmake
# iwgtk
gtk4
meson
qrencode
scdoc
# python-mariadb-connector
mariadb-libs
# smartmontools-svn
subversion
# udevil
gettext
intltool
# wd719x-firmware
lha

View file

@ -0,0 +1,3 @@
0.0 0 0
0
LOCAL

View file

@ -0,0 +1,36 @@
-----BEGIN CERTIFICATE-----
MIIGTzCCBDegAwIBAgIBfDANBgkqhkiG9w0BAQsFADCBsDELMAkGA1UEBhMCVVMx
DzANBgNVBAgTBk9yZWdvbjERMA8GA1UEBxMIUG9ydGxhbmQxHTAbBgNVBAoTFDEy
MDEgQ29tcHV0ZXIgUmVwYWlyMSMwIQYDVQQLExoxMjAxIENlcnRpZmljYXRlIEF1
dGhvcml0eTEVMBMGA1UEAxMMMTIwMSBSb290IENBMSIwIAYJKoZIhvcNAQkBFhNt
YW5hZ2VtZW50QDEyMDEuY29tMB4XDTE4MDgyMDA2MDEwMFoXDTM4MDgyMDA2MDEw
MFowgbAxCzAJBgNVBAYTAlVTMQ8wDQYDVQQIEwZPcmVnb24xETAPBgNVBAcTCFBv
cnRsYW5kMR0wGwYDVQQKExQxMjAxIENvbXB1dGVyIFJlcGFpcjEjMCEGA1UECxMa
MTIwMSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFTATBgNVBAMTDDEyMDEgUm9vdCBD
QTEiMCAGCSqGSIb3DQEJARYTbWFuYWdlbWVudEAxMjAxLmNvbTCCAiIwDQYJKoZI
hvcNAQEBBQADggIPADCCAgoCggIBANGYohJk5/CC/p14R7EpnhdEUF7Wvlnt8yuF
dtuyStlIGkLxPMlj9hQfoLDplQqlKBefTaI3WwrI/Hndso+jStLKgtRWRdyNB34K
AWqT04zXYGicdi3fqaMhEC4SPyX1tRXU2e9kjtIJ21AZx2F40NUjfOMKLVymZgXm
gkG1oA/BSzE8vIidrd/lJPwo0u+EYFa87y+9SHS93Ze1AVoTVqUzSMkjqt+6YIzJ
4XBD7UBvps0Mnd18HMUlXHFXusUL1K921W3wDVcMlNIIA8MJjQk+aVS/1EGSn+81
C+r40x64lYkyh0ZUAHkVXUC/BUfa0SKx1Nfa4mSvtyPnUCb7Dir8MkTDKgopGCok
KmW+VvE2H8AEPCbcctFmhdip19laYxzyDhZ5wiQN6AOg64cWvDf6/uT9hyPvxkj1
ps5vWElryzawTE7h1BI8liMqwsG1Y7cc6D0PABxPsp4iR8pde0oZtpLnEvejRodo
zz3BGvZjq+pHtRMjL+yiDtdAL+K+7/e7gNCQBIGsphahWIOf7TczWVgMNclTNxl3
WZjKkOEs7j+prRTDvffV6H32+Tk5TwgMsfvnY4a37CkJ0L0d1JhWj9wO+gESfg3W
8yvt3hfcj3NOUMJWhJstqlIeX8dj7vVcMhjNvYJxabJmJgk+DNlHe55fXDGJ1CLO
E0EbRTyBAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFM+hXjFx
6BldZFBQW1Pn/Yp3vbw+MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcw
HgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOC
AgEALWcnu3auMSnSSF/kOiLvJ4RAnHZebGYNcUWM14u1K1/XtTB7AFzQIHX7BcDH
m/z4UEyhl9EdR5Bgf2Szuk+8+LyGqcdAdbPoK+bmcwwL8lufDnlIYBThKIBfU2Xw
vw41972B+HH5r1TZXve1EdJaLyImbxmq5s41oH7djGC+sowtyGuVqP7RBguXBGiJ
At1yfdPWVaxLmE8QFknkIvpgTmELpxasTfvgnQBenA3Ts0Z2hwN4796hLbRzGsb8
4hKWAfQDP0klzXKRRyVeAueXxj/FcNZilYxv15MqMc4qrUiW0hXHluQM1yceNjNZ
SE4Igi1Ap71L4PpgkHIDfZD908UexGGkql+p4EWrpnXUYWTa0sHg1bFKQntgpyFg
86Ug0Q7ZNhImENzeigZknL0ceIdaNUCs7UPrkqpUSJR2yujp1JC3tX1LgKZw8B3J
fQx/8h3zzNuz5dVtr1wUJaUD0nGhMIRBEXb2t4jupEISSTN1pkHPcbNzhAQXjVUA
CJxnnz3jmyGsNCoQf7NWfaN6RSRTWehsC6m7JvPvoU2EZoQkSlNOv4xZuFpEx0u7
MFDtC1cSGPH7YwYXPVc45xAMC6Ni8mvq93oT89XZNHIqE8/T8aPHLwYFgu1b1r/A
L8oMEnG5s8tG3n0DcFoOYsaIzVeP0r7B7e3zKui6DQLuu9E=
-----END CERTIFICATE-----

View file

@ -30,6 +30,7 @@ alias rmdirs='find -depth -mindepth 1 -type d -exec rmdir "{}" --ignore-fail-on-
alias rs='rsync -avhPS --stats --exclude-from="$HOME/.rsync_exclusions"'
alias rsz='rsync -avhzPS --stats --exclude-from="$HOME/.rsync_exclusions"'
alias sdu='sudo du -sch --apparent-size'
alias set_lp8550_slope='sudo set_lp8550_slope.py'
alias srmdirs='sudo find -depth -mindepth 1 -type d -exec rmdir "{}" --ignore-fail-on-non-empty \;'
alias srs='sudo rsync -avhPS --stats --exclude-from="$HOME/.rsync_exclusions"'
alias srsz='sudo rsync -avhzPS --stats --exclude-from="$HOME/.rsync_exclusions"'

View file

@ -0,0 +1,4 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by fontconfig.
# For information about cache directory tags, see:
# http://www.brynosaurus.com/cachedir/

File diff suppressed because it is too large Load diff

View file

@ -88,6 +88,7 @@ ${memgraph}
#Network
${alignc}S H O R T C U T K E Y S
${hr}
[Super] + c${alignr}WK Clone
[Super] + d${alignr}HW Diagnostics
[Super] + f${alignr}File Manager
[Super] + i${alignr}HW Information

View file

@ -19,7 +19,7 @@
<execute>gsmartcontrol_polkit</execute>
</action> </item>
<item label="Web Browser"> <action name="Execute">
<execute>firefox</execute>
<execute>netsurf</execute>
</action> </item>
<separator/>
<menu id="all-items-menu" label="All Programs">
@ -75,8 +75,8 @@
<item label="ELinks"> <action name="Execute">
<execute>st -e elinks</execute>
</action> </item>
<item label="FireFox"> <action name="Execute">
<execute>firefox</execute>
<item label="NetSurf"> <action name="Execute">
<execute>netsurf</execute>
</action> </item>
<item label="FTP"> <action name="Execute">
<execute>st -e ftp</execute>
@ -124,8 +124,8 @@
<item label="MC"> <action name="Execute">
<execute>st -e mc</execute>
</action> </item>
<item label="Thunar File Manager"> <action name="Execute">
<execute>thunar</execute>
<item label="PCMan File Manager"> <action name="Execute">
<execute>pcmanfm</execute>
</action> </item>
<item label="st"> <action name="Execute">
<execute>st</execute>
@ -139,7 +139,7 @@
</action> </item>
</menu>
<item label="File Manager"> <action name="Execute">
<execute>thunar-settings</execute>
<execute>pcmanfm</execute>
</action> </item>
<item label="Preferred Applications"> <action name="Execute">
<execute>exo-preferred-applications</execute>
@ -151,9 +151,6 @@
<item label="Avahi Zeroconf Browser"> <action name="Execute">
<execute>avahi-discover</execute>
</action> </item>
<item label="Bulk Rename"> <action name="Execute">
<execute>/usr/lib/Thunar/ThunarBulkRename</execute>
</action> </item>
<item label="Conky"> <action name="Execute">
<execute>st -e conky</execute>
</action> </item>

View file

@ -295,6 +295,11 @@
<menu>root-menu</menu>
</action>
</keybind>
<keybind key="C-A-c">
<action name="Execute">
<command>st -t "WKClone (ddrescue-tui)" -e resize-and-run ddrescue-tui clone</command>
</action>
</keybind>
<keybind key="C-A-d">
<action name="Execute">
<command>st -t "Hardware Diagnostics" -e resize-and-run hw-diags</command>
@ -302,12 +307,12 @@
</keybind>
<keybind key="C-A-f">
<action name="Execute">
<command>thunar</command>
<command>pcmanfm</command>
</action>
</keybind>
<keybind key="C-A-i">
<action name="Execute">
<command>hardinfo</command>
<command>st -t "Hardware Info" -e hw-info-helper</command>
</action>
</keybind>
<keybind key="C-A-m">
@ -337,7 +342,7 @@
</keybind>
<keybind key="C-A-w">
<action name="Execute">
<command>firefox</command>
<command>netsurf</command>
</action>
</keybind>
<keybind key="C-A-x">
@ -345,6 +350,11 @@
<command>menu_powermenu</command>
</action>
</keybind>
<keybind key="W-c">
<action name="Execute">
<command>st -t "WKClone (ddrescue-tui)" -e resize-and-run ddrescue-tui clone</command>
</action>
</keybind>
<keybind key="W-d">
<action name="Execute">
<command>st -t "Hardware Diagnostics" -e resize-and-run hw-diags</command>
@ -352,12 +362,12 @@
</keybind>
<keybind key="W-f">
<action name="Execute">
<command>thunar</command>
<command>pcmanfm</command>
</action>
</keybind>
<keybind key="W-i">
<action name="Execute">
<command>hardinfo</command>
<command>st -t "Hardware Info" -e hw-info-helper</command>
</action>
</keybind>
<keybind key="W-m">
@ -387,7 +397,7 @@
</keybind>
<keybind key="W-w">
<action name="Execute">
<command>firefox</command>
<command>netsurf</command>
</action>
</keybind>
<keybind key="W-x">

View file

@ -0,0 +1,7 @@
ServerAliveInterval 120
Host *
LogLevel=quiet
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null

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