Merge branch 'dev' of github.com:2Shirt/WizardKit into dev

This commit is contained in:
2Shirt 2018-05-18 21:04:49 -06:00
commit 3285a640c7
17 changed files with 187 additions and 83 deletions

View file

@ -436,13 +436,15 @@ function ask() {
# VARIABLES # VARIABLES
DEST_DEV="${arg_u}" DEST_DEV="${arg_u}"
DEST_PAR="${DEST_DEV}1" DEST_PAR="${DEST_DEV}1"
LOG_FILE="${HOME}/build-ufd_${DEST_DEV##*/}_$(date +%Y-%m-%d_%H%M_%z).log" LOG_FILE="$(getent passwd "$SUDO_USER" | cut -d: -f6)/Logs/build-ufd_${DEST_DEV##*/}_$(date +%Y-%m-%d_%H%M_%z).log"
MAIN_PY="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/settings/main.py" MAIN_PY="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/settings/main.py"
RSYNC_ARGS="-hrtuvS --modify-window=1 --progress" RSYNC_ARGS="-hrtuvS --modify-window=1 --progress"
MAIN_KIT="$(realpath "${arg_m:-}" 2>/dev/null || true)" MAIN_KIT="$(realpath "${arg_m:-}" 2>/dev/null || true)"
LINUX_ISO="$(realpath "${arg_l:-}" 2>/dev/null || true)" LINUX_ISO="$(realpath "${arg_l:-}" 2>/dev/null || true)"
WINPE_ISO="$(realpath "${arg_w:-}" 2>/dev/null || true)" WINPE_ISO="$(realpath "${arg_w:-}" 2>/dev/null || true)"
EXTRA_DIR="$(realpath "${arg_e:-}" 2>/dev/null || true)" EXTRA_DIR="$(realpath "${arg_e:-}" 2>/dev/null || true)"
mkdir -p "$(dirname "$LOG_FILE")"
chown "$SUDO_USER:$SUDO_USER" -R "$(dirname "$LOG_FILE")"
# COLORS # COLORS
CLEAR="\e[0m" CLEAR="\e[0m"

View file

@ -34,7 +34,7 @@ function DownloadFile ($Path, $Name, $Url) {
} }
catch { catch {
Write-Host (" ERROR: Failed to download file." ) -ForegroundColor "Red" Write-Host (" ERROR: Failed to download file." ) -ForegroundColor "Red"
$DownloadErrors += 1 $global:DownloadErrors += 1
} }
} }
function FindDynamicUrl ($SourcePage, $RegEx) { function FindDynamicUrl ($SourcePage, $RegEx) {
@ -78,11 +78,11 @@ if ($MyInvocation.InvocationName -ne ".") {
$Path = $Temp $Path = $Temp
# 7-Zip # 7-Zip
DownloadFile -Path $Path -Name "7z-installer.msi" -Url "http://www.7-zip.org/a/7z1801.msi" DownloadFile -Path $Path -Name "7z-installer.msi" -Url "https://www.7-zip.org/a/7z1805.msi"
DownloadFile -Path $Path -Name "7z-extra.7z" -Url "http://www.7-zip.org/a/7z1801-extra.7z" DownloadFile -Path $Path -Name "7z-extra.7z" -Url "https://www.7-zip.org/a/7z1805-extra.7z"
# ConEmu # ConEmu
$Url = "https://github.com/Maximus5/ConEmu/releases/download/v18.02.06/ConEmuPack.180206.7z" $Url = "https://github.com/Maximus5/ConEmu/releases/download/v18.05.06/ConEmuPack.180506.7z"
DownloadFile -Path $Path -Name "ConEmuPack.7z" -Url $Url DownloadFile -Path $Path -Name "ConEmuPack.7z" -Url $Url
# Notepad++ # Notepad++
@ -90,9 +90,9 @@ if ($MyInvocation.InvocationName -ne ".") {
DownloadFile -Path $Path -Name "npp.7z" -Url $Url DownloadFile -Path $Path -Name "npp.7z" -Url $Url
# Python # Python
$Url = "https://www.python.org/ftp/python/3.6.4/python-3.6.4-embed-win32.zip" $Url = "https://www.python.org/ftp/python/3.6.5/python-3.6.5-embed-win32.zip"
DownloadFile -Path $Path -Name "python32.zip" -Url $Url DownloadFile -Path $Path -Name "python32.zip" -Url $Url
$Url = "https://www.python.org/ftp/python/3.6.4/python-3.6.4-embed-amd64.zip" $Url = "https://www.python.org/ftp/python/3.6.5/python-3.6.5-embed-amd64.zip"
DownloadFile -Path $Path -Name "python64.zip" -Url $Url DownloadFile -Path $Path -Name "python64.zip" -Url $Url
# Python: psutil # Python: psutil

View file

@ -70,7 +70,7 @@ function DownloadFile ($Path, $Name, $Url) {
} }
catch { catch {
Write-Host (" ERROR: Failed to download file." ) -ForegroundColor "Red" Write-Host (" ERROR: Failed to download file." ) -ForegroundColor "Red"
$DownloadErrors += 1 $global:DownloadErrors += 1
} }
} }
function FindDynamicUrl ($SourcePage, $RegEx) { function FindDynamicUrl ($SourcePage, $RegEx) {
@ -130,16 +130,16 @@ if ($MyInvocation.InvocationName -ne ".") {
## Download Tools ## ## Download Tools ##
$ToolSources = @( $ToolSources = @(
# 7-Zip # 7-Zip
@("7z-installer.msi", "http://www.7-zip.org/a/7z1801.msi"), @("7z-installer.msi", "https://www.7-zip.org/a/7z1805.msi"),
@("7z-extra.7z", "http://www.7-zip.org/a/7z1801-extra.7z"), @("7z-extra.7z", "https://www.7-zip.org/a/7z1805-extra.7z"),
# Blue Screen View # Blue Screen View
@("bluescreenview64.zip", "http://www.nirsoft.net/utils/bluescreenview-x64.zip"),
@("bluescreenview32.zip", "http://www.nirsoft.net/utils/bluescreenview.zip"), @("bluescreenview32.zip", "http://www.nirsoft.net/utils/bluescreenview.zip"),
@("bluescreenview64.zip", "http://www.nirsoft.net/utils/bluescreenview-x64.zip"),
# ConEmu # ConEmu
@("ConEmuPack.7z", "https://github.com/Maximus5/ConEmu/releases/download/v18.02.06/ConEmuPack.180206.7z"), @("ConEmuPack.7z", "https://github.com/Maximus5/ConEmu/releases/download/v18.05.06/ConEmuPack.180506.7z"),
# Fast Copy # Fast Copy
@("fastcopy64.zip", "http://ftp.vector.co.jp/69/93/2323/FastCopy341_x64.zip"),
@("fastcopy32.zip", "http://ftp.vector.co.jp/69/93/2323/FastCopy341.zip"), @("fastcopy32.zip", "http://ftp.vector.co.jp/69/93/2323/FastCopy341.zip"),
@("fastcopy64.zip", "http://ftp.vector.co.jp/69/93/2323/FastCopy341_x64.zip"),
# HWiNFO # HWiNFO
@("hwinfo.zip", "http://app.oldfoss.com:81/download/HWiNFO/hwi_582.zip"), @("hwinfo.zip", "http://app.oldfoss.com:81/download/HWiNFO/hwi_582.zip"),
# Killer Network Drivers # Killer Network Drivers
@ -148,19 +148,19 @@ if ($MyInvocation.InvocationName -ne ".") {
("http://www.killernetworking.com"+(FindDynamicUrl "http://www.killernetworking.com/driver-downloads/item/killer-drivers-inf" "Download Killer-Ethernet").replace('&', '&')) ("http://www.killernetworking.com"+(FindDynamicUrl "http://www.killernetworking.com/driver-downloads/item/killer-drivers-inf" "Download Killer-Ethernet").replace('&', '&'))
), ),
# Notepad++ # Notepad++
@("npp_amd64.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.6/npp.7.5.6.bin.minimalist.x64.7z"),
@("npp_x86.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.6/npp.7.5.6.bin.minimalist.7z"), @("npp_x86.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.6/npp.7.5.6.bin.minimalist.7z"),
@("npp_amd64.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.6/npp.7.5.6.bin.minimalist.x64.7z"),
# NT Password Editor # NT Password Editor
@("ntpwed.zip", "http://cdslow.org.ru/files/ntpwedit/ntpwed07.zip"), @("ntpwed.zip", "http://cdslow.org.ru/files/ntpwedit/ntpwed07.zip"),
# Prime95 # Prime95
@("prime95_64.zip", "http://www.mersenne.org/ftp_root/gimps/p95v294b8.win64.zip"),
@("prime95_32.zip", "http://www.mersenne.org/ftp_root/gimps/p95v294b7.win32.zip"), @("prime95_32.zip", "http://www.mersenne.org/ftp_root/gimps/p95v294b7.win32.zip"),
@("prime95_64.zip", "http://www.mersenne.org/ftp_root/gimps/p95v294b8.win64.zip"),
# ProduKey # ProduKey
@("produkey64.zip", "http://www.nirsoft.net/utils/produkey-x64.zip"),
@("produkey32.zip", "http://www.nirsoft.net/utils/produkey.zip"), @("produkey32.zip", "http://www.nirsoft.net/utils/produkey.zip"),
@("produkey64.zip", "http://www.nirsoft.net/utils/produkey-x64.zip"),
# Python # Python
@("python64.zip", "https://www.python.org/ftp/python/3.6.4/python-3.6.4-embed-amd64.zip"), @("python32.zip", "https://www.python.org/ftp/python/3.6.5/python-3.6.5-embed-win32.zip"),
@("python32.zip", "https://www.python.org/ftp/python/3.6.4/python-3.6.4-embed-win32.zip"), @("python64.zip", "https://www.python.org/ftp/python/3.6.5/python-3.6.5-embed-amd64.zip"),
# Python: psutil # Python: psutil
@( @(
"psutil64.whl", "psutil64.whl",
@ -171,14 +171,14 @@ if ($MyInvocation.InvocationName -ne ".") {
(FindDynamicUrl "https://pypi.org/project/psutil/" "href=.*-cp36-cp36m-win32.whl") (FindDynamicUrl "https://pypi.org/project/psutil/" "href=.*-cp36-cp36m-win32.whl")
), ),
# Q-Dir # Q-Dir
@("qdir64.zip", "https://www.softwareok.com/Download/Q-Dir_Portable_x64.zip"),
@("qdir32.zip", "https://www.softwareok.com/Download/Q-Dir_Portable.zip"), @("qdir32.zip", "https://www.softwareok.com/Download/Q-Dir_Portable.zip"),
@("qdir64.zip", "https://www.softwareok.com/Download/Q-Dir_Portable_x64.zip"),
# TestDisk / PhotoRec # TestDisk / PhotoRec
@("testdisk64.zip", "https://www.cgsecurity.org/testdisk-7.1-WIP.win64.zip"),
@("testdisk32.zip", "https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip"), @("testdisk32.zip", "https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip"),
@("testdisk64.zip", "https://www.cgsecurity.org/testdisk-7.1-WIP.win64.zip"),
# wimlib-imagex # wimlib-imagex
@("wimlib64.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-bin.zip"), @("wimlib32.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip"),
@("wimlib32.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip") @("wimlib64.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-bin.zip")
) )
foreach ($Tool in $ToolSources) { foreach ($Tool in $ToolSources) {
DownloadFile -Path $Temp -Name $Tool[0] -Url $Tool[1] DownloadFile -Path $Temp -Name $Tool[0] -Url $Tool[1]

View file

@ -1,5 +1,7 @@
# Wizard Kit: Functions - Backup # Wizard Kit: Functions - Backup
import ctypes
from functions.disk import * from functions.disk import *
# Regex # Regex
@ -30,9 +32,41 @@ def backup_partition(disk, par):
def fix_path(path): def fix_path(path):
"""Replace invalid filename characters with underscores.""" """Replace invalid filename characters with underscores."""
return REGEX_BAD_PATH_NAMES.sub('_', path) local_drive = path[1:2] == ':'
new_path = REGEX_BAD_PATH_NAMES.sub('_', path)
if local_drive:
new_path = '{}:{}'.format(new_path[0:1], new_path[2:])
return new_path
def prep_disk_for_backup(destination, disk, ticket_number): def get_volume_display_name(mountpoint):
"""Get display name from volume mountpoint and label, returns str."""
name = mountpoint
try:
kernel32 = ctypes.windll.kernel32
vol_name_buffer = ctypes.create_unicode_buffer(1024)
fs_name_buffer = ctypes.create_unicode_buffer(1024)
serial_number = None
max_component_length = None
file_system_flags = None
vol_info = kernel32.GetVolumeInformationW(
ctypes.c_wchar_p(mountpoint),
vol_name_buffer,
ctypes.sizeof(vol_name_buffer),
serial_number,
max_component_length,
file_system_flags,
fs_name_buffer,
ctypes.sizeof(fs_name_buffer)
)
name = '{} "{}"'.format(name, vol_name_buffer.value)
except:
pass
return name
def prep_disk_for_backup(destination, disk, backup_prefix):
"""Gather details about the disk and its partitions. """Gather details about the disk and its partitions.
This includes partitions that can't be backed up, This includes partitions that can't be backed up,
@ -71,10 +105,10 @@ def prep_disk_for_backup(destination, disk, ticket_number):
par['Image Name'] = par['Name'] if par['Name'] else 'Unknown' par['Image Name'] = par['Name'] if par['Name'] else 'Unknown'
if 'IP' in destination: if 'IP' in destination:
par['Image Path'] = r'\\{}\{}\{}'.format( par['Image Path'] = r'\\{}\{}\{}'.format(
destination['IP'], destination['Share'], ticket_number) destination['IP'], destination['Share'], backup_prefix)
else: else:
par['Image Path'] = r'{}:\{}'.format( par['Image Path'] = r'{}:\{}'.format(
ticket_number, destination['Letter']) destination['Letter'], backup_prefix)
par['Image Path'] += r'\{}_{}.wim'.format( par['Image Path'] += r'\{}_{}.wim'.format(
par['Number'], par['Image Name']) par['Number'], par['Image Name'])
par['Image Path'] = fix_path(par['Image Path']) par['Image Path'] = fix_path(par['Image Path'])
@ -114,7 +148,20 @@ def select_backup_destination(auto_select=True):
actions = [ actions = [
{'Name': 'Main Menu', 'Letter': 'M'}, {'Name': 'Main Menu', 'Letter': 'M'},
] ]
# Add local disks
for d in psutil.disk_partitions():
if re.search(r'^{}'.format(global_vars['Env']['SYSTEMDRIVE']), d.mountpoint, re.IGNORECASE):
# Skip current OS drive
pass
elif 'fixed' in d.opts:
# Skip DVD, etc
destinations.append({
'Name': 'Local Disk - {}'.format(
get_volume_display_name(d.mountpoint)),
'Letter': re.sub(r'^(\w):\\.*$', r'\1', d.mountpoint),
})
# Size check # Size check
for dest in destinations: for dest in destinations:
if 'IP' in dest: if 'IP' in dest:

View file

@ -190,12 +190,17 @@ def extract_item(item, filter='', silent=False):
print_standard('Extracting "{item}"...'.format(item=item)) print_standard('Extracting "{item}"...'.format(item=item))
try: try:
run_program(cmd) run_program(cmd)
except FileNotFoundError:
if not silent:
print_warning('WARNING: Archive not found')
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
if not silent: if not silent:
print_warning('WARNING: Errors encountered while exctracting data') print_warning('WARNING: Errors encountered while exctracting data')
def get_ticket_number(): def get_ticket_number():
"""Get TicketNumber from user, save in LogDir, and return as str.""" """Get TicketNumber from user, save in LogDir, and return as str."""
if not ENABLED_TICKET_NUMBERS:
return None
ticket_number = None ticket_number = None
while ticket_number is None: while ticket_number is None:
_input = input('Enter ticket number: ') _input = input('Enter ticket number: ')
@ -208,6 +213,15 @@ def get_ticket_number():
f.write(ticket_number) f.write(ticket_number)
return ticket_number return ticket_number
def get_simple_string(prompt='Enter string'):
"""Get string from user (only alphanumeric/space chars) and return as str."""
simple_string = None
while simple_string is None:
_input = input('{}: '.format(prompt))
if re.match(r'^(\w|-| )+$', _input, re.ASCII):
simple_string = _input.strip()
return simple_string
def human_readable_size(size, decimals=0): def human_readable_size(size, decimals=0):
"""Convert size in bytes to a human-readable format and return a str.""" """Convert size in bytes to a human-readable format and return a str."""
# Prep string formatting # Prep string formatting

View file

@ -534,21 +534,21 @@ def select_destination(folder_path, prompt='Select destination'):
return path return path
def select_source(ticket_number): def select_source(backup_prefix):
"""Select backup from those found on the BACKUP_SERVERS for the ticket.""" """Select backup from those found on the BACKUP_SERVERS matching the prefix."""
selected_source = None selected_source = None
local_sources = [] local_sources = []
remote_sources = [] remote_sources = []
sources = [] sources = []
mount_backup_shares(read_write=False) mount_backup_shares(read_write=False)
# Check for ticket folders on servers # Check for prefix folders on servers
for server in BACKUP_SERVERS: for server in BACKUP_SERVERS:
if server['Mounted']: if server['Mounted']:
print_standard('Scanning {}...'.format(server['Name'])) print_standard('Scanning {}...'.format(server['Name']))
for d in os.scandir(r'\\{IP}\{Share}'.format(**server)): for d in os.scandir(r'\\{IP}\{Share}'.format(**server)):
if (d.is_dir() if (d.is_dir()
and d.name.lower().startswith(ticket_number.lower())): and d.name.lower().startswith(backup_prefix.lower())):
# Add folder to remote_sources # Add folder to remote_sources
remote_sources.append({ remote_sources.append({
'Name': '{:9}| File-Based: [DIR] {}'.format( 'Name': '{:9}| File-Based: [DIR] {}'.format(
@ -558,19 +558,19 @@ def select_source(ticket_number):
'Source': d}) 'Source': d})
# Check for images and subfolders # Check for images and subfolders
for ticket_path in remote_sources.copy(): for prefix_path in remote_sources.copy():
for item in os.scandir(ticket_path['Source'].path): for item in os.scandir(prefix_path['Source'].path):
if item.is_dir(): if item.is_dir():
# Add folder to remote_sources # Add folder to remote_sources
remote_sources.append({ remote_sources.append({
'Name': r'{:9}| File-Based: [DIR] {}\{}'.format( 'Name': r'{:9}| File-Based: [DIR] {}\{}'.format(
ticket_path['Server']['Name'], # Server prefix_path['Server']['Name'], # Server
ticket_path['Source'].name, # Ticket folder prefix_path['Source'].name, # Prefix folder
item.name, # Sub-folder item.name, # Sub-folder
), ),
'Server': ticket_path['Server'], 'Server': prefix_path['Server'],
'Sort': r'{}\{}'.format( 'Sort': r'{}\{}'.format(
ticket_path['Source'].name, # Ticket folder prefix_path['Source'].name, # Prefix folder
item.name, # Sub-folder item.name, # Sub-folder
), ),
'Source': item}) 'Source': item})
@ -586,15 +586,15 @@ def select_source(ticket_number):
remote_sources.append({ remote_sources.append({
'Disabled': bool(not is_valid_wim_file(subitem)), 'Disabled': bool(not is_valid_wim_file(subitem)),
'Name': r'{:9}| Image-Based: {:>7} {}\{}\{}'.format( 'Name': r'{:9}| Image-Based: {:>7} {}\{}\{}'.format(
ticket_path['Server']['Name'], # Server prefix_path['Server']['Name'], # Server
size, # Size (duh) size, # Size (duh)
ticket_path['Source'].name, # Ticket folder prefix_path['Source'].name, # Prefix folder
item.name, # Sub-folder item.name, # Sub-folder
subitem.name, # Image file subitem.name, # Image file
), ),
'Server': ticket_path['Server'], 'Server': prefix_path['Server'],
'Sort': r'{}\{}\{}'.format( 'Sort': r'{}\{}\{}'.format(
ticket_path['Source'].name, # Ticket folder prefix_path['Source'].name, # Prefix folder
item.name, # Sub-folder item.name, # Sub-folder
subitem.name, # Image file subitem.name, # Image file
), ),
@ -608,14 +608,14 @@ def select_source(ticket_number):
remote_sources.append({ remote_sources.append({
'Disabled': bool(not is_valid_wim_file(item)), 'Disabled': bool(not is_valid_wim_file(item)),
'Name': r'{:9}| Image-Based: {:>7} {}\{}'.format( 'Name': r'{:9}| Image-Based: {:>7} {}\{}'.format(
ticket_path['Server']['Name'], # Server prefix_path['Server']['Name'], # Server
size, # Size (duh) size, # Size (duh)
ticket_path['Source'].name, # Ticket folder prefix_path['Source'].name, # Prefix folder
item.name, # Image file item.name, # Image file
), ),
'Server': ticket_path['Server'], 'Server': prefix_path['Server'],
'Sort': r'{}\{}'.format( 'Sort': r'{}\{}'.format(
ticket_path['Source'].name, # Ticket folder prefix_path['Source'].name, # Prefix folder
item.name, # Image file item.name, # Image file
), ),
'Source': item}) 'Source': item})
@ -682,8 +682,8 @@ def select_source(ticket_number):
else: else:
selected_source = sources[int(selection)-1]['Source'] selected_source = sources[int(selection)-1]['Source']
else: else:
print_error('ERROR: No backups found for ticket: {}.'.format( print_error('ERROR: No backups found using prefix: {}.'.format(
ticket_number)) backup_prefix))
umount_backup_shares() umount_backup_shares()
pause("Press Enter to exit...") pause("Press Enter to exit...")
exit_script() exit_script()

View file

@ -125,9 +125,9 @@ def menu_diags(*args):
if diag_modes[int(selection)-1]['Name'] != 'Quick drive test': if diag_modes[int(selection)-1]['Name'] != 'Quick drive test':
# Save log for non-quick tests # Save log for non-quick tests
ticket_number = get_ticket_number() ticket_number = get_ticket_number()
global_vars['LogDir'] = '{}/Tickets/{}'.format( global_vars['LogDir'] = '{}/Logs/{}'.format(
global_vars['Env']['HOME'], global_vars['Env']['HOME'],
ticket_number) ticket_number if ticket_number else global_vars['Date-Time'])
os.makedirs(global_vars['LogDir'], exist_ok=True) os.makedirs(global_vars['LogDir'], exist_ok=True)
global_vars['LogFile'] = '{}/Hardware Diagnostics.log'.format( global_vars['LogFile'] = '{}/Hardware Diagnostics.log'.format(
global_vars['LogDir']) global_vars['LogDir'])
@ -503,7 +503,7 @@ def run_tests(tests):
# Open log # Open log
if not TESTS['NVMe/SMART']['Quick']: if not TESTS['NVMe/SMART']['Quick']:
try: try:
popen_program(['nohup', 'leafpad', global_vars['LogFile']]) popen_program(['nohup', 'leafpad', global_vars['LogFile']], pipe=True)
except Exception: except Exception:
print_error('ERROR: Failed to open log: {}'.format( print_error('ERROR: Failed to open log: {}'.format(
global_vars['LogFile'])) global_vars['LogFile']))

View file

@ -75,11 +75,22 @@ def menu_backup():
}} }}
set_title('{}: Backup Menu'.format(KIT_NAME_FULL)) set_title('{}: Backup Menu'.format(KIT_NAME_FULL))
# Set ticket Number # Set backup prefix
clear_screen() clear_screen()
print_standard('{}\n'.format(global_vars['Title'])) print_standard('{}\n'.format(global_vars['Title']))
ticket_number = get_ticket_number() ticket_number = get_ticket_number()
if ENABLED_TICKET_NUMBERS:
backup_prefix = ticket_number
else:
backup_prefix = get_simple_string(prompt='Enter backup name prefix')
backup_prefix = backup_prefix.replace(' ', '_')
# Assign drive letters
try_and_print(
message = 'Assigning letters...',
function = assign_volume_letters,
other_results = other_results)
# Mount backup shares # Mount backup shares
mount_backup_shares(read_write=True) mount_backup_shares(read_write=True)
@ -87,10 +98,6 @@ def menu_backup():
destination = select_backup_destination(auto_select=False) destination = select_backup_destination(auto_select=False)
# Scan disks # Scan disks
try_and_print(
message = 'Assigning letters...',
function = assign_volume_letters,
other_results = other_results)
result = try_and_print( result = try_and_print(
message = 'Getting disk info...', message = 'Getting disk info...',
function = scan_disks, function = scan_disks,
@ -107,12 +114,13 @@ def menu_backup():
raise GenericAbort raise GenericAbort
# "Prep" disk # "Prep" disk
prep_disk_for_backup(destination, disk, ticket_number) prep_disk_for_backup(destination, disk, backup_prefix)
# Display details for backup task # Display details for backup task
clear_screen() clear_screen()
print_info('Create Backup - Details:\n') print_info('Create Backup - Details:\n')
show_data(message='Ticket:', data=ticket_number) if ENABLED_TICKET_NUMBERS:
show_data(message='Ticket:', data=ticket_number)
show_data( show_data(
message = 'Source:', message = 'Source:',
data = '[{}] ({}) {} {}'.format( data = '[{}] ({}) {} {}'.format(
@ -264,13 +272,14 @@ def menu_setup():
windows_version = select_windows_version() windows_version = select_windows_version()
# Find Windows image # Find Windows image
# NOTE: Reassign volume letters to ensure all devices are scanned
try_and_print(
message = 'Assigning volume letters...',
function = assign_volume_letters,
other_results = other_results)
windows_image = find_windows_image(windows_version) windows_image = find_windows_image(windows_version)
# Scan disks # Scan disks
try_and_print(
message = 'Assigning letters...',
function = assign_volume_letters,
other_results = other_results)
result = try_and_print( result = try_and_print(
message = 'Getting disk info...', message = 'Getting disk info...',
function = scan_disks, function = scan_disks,
@ -292,7 +301,8 @@ def menu_setup():
# Display details for setup task # Display details for setup task
clear_screen() clear_screen()
print_info('Setup Windows - Details:\n') print_info('Setup Windows - Details:\n')
show_data(message='Ticket:', data=ticket_number) if ENABLED_TICKET_NUMBERS:
show_data(message='Ticket:', data=ticket_number)
show_data(message='Installing:', data=windows_version['Name']) show_data(message='Installing:', data=windows_version['Name'])
show_data( show_data(
message = 'Boot Method:', message = 'Boot Method:',

View file

@ -29,7 +29,7 @@ if __name__ == '__main__':
print_standard('\nDone.') print_standard('\nDone.')
if 'gui' in sys.argv: if 'gui' in sys.argv:
pause("Press Enter to exit...") pause("Press Enter to exit...")
popen_program(['nohup', 'thunar', '/media']) popen_program(['nohup', 'thunar', '/media'], pipe=True)
exit_script() exit_script()
except SystemExit: except SystemExit:
pass pass

View file

@ -294,8 +294,8 @@ LAUNCHERS = {
'Intel RST (Current Release)': { 'Intel RST (Current Release)': {
'L_TYPE': 'Executable', 'L_TYPE': 'Executable',
'L_PATH': '_Drivers\Intel RST', 'L_PATH': '_Drivers\Intel RST',
'L_ITEM': 'SetupRST_15.9.exe', 'L_ITEM': 'SetupRST_16.0.exe',
'L_7ZIP': 'SetupRST_15.9.exe', 'L_7ZIP': 'SetupRST_16.0.exe',
}, },
'Intel RST (Previous Releases)': { 'Intel RST (Previous Releases)': {
'L_TYPE': 'Folder', 'L_TYPE': 'Folder',

View file

@ -2,6 +2,7 @@
# Features # Features
ENABLED_UPLOAD_DATA = False ENABLED_UPLOAD_DATA = False
ENABLED_TICKET_NUMBERS = False
# STATIC VARIABLES (also used by BASH and BATCH files) # STATIC VARIABLES (also used by BASH and BATCH files)
## NOTE: There are no spaces around the = for easier parsing in BASH and BATCH ## NOTE: There are no spaces around the = for easier parsing in BASH and BATCH

View file

@ -2,7 +2,7 @@
SOURCE_URLS = { SOURCE_URLS = {
'AIDA64': 'http://download.aida64.com/aida64engineer597.zip', 'AIDA64': 'http://download.aida64.com/aida64engineer597.zip',
'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1801120035/AcroRdrDC1801120035_en_US.exe', 'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1801120040/AcroRdrDC1801120040_en_US.exe',
'AdwCleaner': 'https://toolslib.net/downloads/finish/1-adwcleaner/', 'AdwCleaner': 'https://toolslib.net/downloads/finish/1-adwcleaner/',
'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip', 'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip',
'BleachBit': 'https://download.bleachbit.org/BleachBit-2.0-portable.zip', 'BleachBit': 'https://download.bleachbit.org/BleachBit-2.0-portable.zip',
@ -16,7 +16,7 @@ SOURCE_URLS = {
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.895.x64.zip', 'Everything64': 'https://www.voidtools.com/Everything-1.4.1.895.x64.zip',
'FastCopy32': 'http://ftp.vector.co.jp/69/93/2323/FastCopy341.zip', 'FastCopy32': 'http://ftp.vector.co.jp/69/93/2323/FastCopy341.zip',
'FastCopy64': 'http://ftp.vector.co.jp/69/93/2323/FastCopy341_x64.zip', 'FastCopy64': 'http://ftp.vector.co.jp/69/93/2323/FastCopy341_x64.zip',
'Firefox uBO': 'https://addons.cdn.mozilla.net/user-media/addons/607454/ublock_origin-1.15.10-an+fx.xpi?filehash=sha256%3A30b258803fd6cd988c5ba479f2f6ff5b4e9b40110c81e3421a6867b20ec718a6', 'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/956394/ublock_origin-1.16.6-an+fx.xpi',
'HWiNFO': 'http://app.oldfoss.com:81/download/HWiNFO/hwi_582.zip', 'HWiNFO': 'http://app.oldfoss.com:81/download/HWiNFO/hwi_582.zip',
'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe', 'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe',
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe', 'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
@ -25,7 +25,7 @@ SOURCE_URLS = {
'KVRT': 'http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe', 'KVRT': 'http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe',
'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.5.6/npp.7.5.6.bin.minimalist.7z', 'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.5.6/npp.7.5.6.bin.minimalist.7z',
'Office Deployment Tool 2013': 'https://download.microsoft.com/download/6/2/3/6230F7A2-D8A9-478B-AC5C-57091B632FCF/officedeploymenttool_x86_4827-1000.exe', 'Office Deployment Tool 2013': 'https://download.microsoft.com/download/6/2/3/6230F7A2-D8A9-478B-AC5C-57091B632FCF/officedeploymenttool_x86_4827-1000.exe',
'Office Deployment Tool 2016': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_8529.3600.exe', 'Office Deployment Tool 2016': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_9326.3600.exe',
'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip', 'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip',
'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip', 'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip',
'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip', 'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip',
@ -196,6 +196,7 @@ RST_SOURCES = {
'SetupRST_14.8.exe': 'https://downloadmirror.intel.com/26759/eng/setuprst.exe', 'SetupRST_14.8.exe': 'https://downloadmirror.intel.com/26759/eng/setuprst.exe',
'SetupRST_15.8.exe': 'https://downloadmirror.intel.com/27442/eng/SetupRST.exe', 'SetupRST_15.8.exe': 'https://downloadmirror.intel.com/27442/eng/SetupRST.exe',
'SetupRST_15.9.exe': 'https://downloadmirror.intel.com/27400/eng/SetupRST.exe', 'SetupRST_15.9.exe': 'https://downloadmirror.intel.com/27400/eng/SetupRST.exe',
'SetupRST_16.0.exe': 'https://downloadmirror.intel.com/27681/eng/SetupRST.exe',
} }

View file

@ -29,8 +29,11 @@ if __name__ == '__main__':
'FileNotFoundError': 'File not found', 'FileNotFoundError': 'File not found',
}, },
'Warning': {}} 'Warning': {}}
print_info('Starting System Checklist for Ticket #{}\n'.format( if ENABLED_TICKET_NUMBERS:
ticket_number)) print_info('Starting System Checklist for Ticket #{}\n'.format(
ticket_number))
else:
print_info('Starting System Checklist\n')
# Configure # Configure
print_info('Configure') print_info('Configure')

View file

@ -31,8 +31,11 @@ if __name__ == '__main__':
'GenericRepair': 'Repaired', 'GenericRepair': 'Repaired',
'UnsupportedOSError': 'Unsupported OS', 'UnsupportedOSError': 'Unsupported OS',
}} }}
print_info('Starting System Diagnostics for Ticket #{}\n'.format( if ENABLED_TICKET_NUMBERS:
ticket_number)) print_info('Starting System Diagnostics for Ticket #{}\n'.format(
ticket_number))
else:
print_info('Starting System Diagnostics\n')
# Sanitize Environment # Sanitize Environment
print_info('Sanitizing Environment') print_info('Sanitizing Environment')

View file

@ -18,17 +18,29 @@ if __name__ == '__main__':
stay_awake() stay_awake()
clear_screen() clear_screen()
print_info('{}: User Data Transfer Tool\n'.format(KIT_NAME_FULL)) print_info('{}: User Data Transfer Tool\n'.format(KIT_NAME_FULL))
# Get backup name prefix
ticket_number = get_ticket_number() ticket_number = get_ticket_number()
if ENABLED_TICKET_NUMBERS:
backup_prefix = ticket_number
else:
backup_prefix = get_simple_string(prompt='Enter backup name prefix')
backup_prefix = backup_prefix.replace(' ', '_')
# Set destination
folder_path = r'{}\Transfer'.format(KIT_NAME_SHORT) folder_path = r'{}\Transfer'.format(KIT_NAME_SHORT)
dest = select_destination(folder_path=folder_path, dest = select_destination(folder_path=folder_path,
prompt='Which disk are we transferring to?') prompt='Which disk are we transferring to?')
source = select_source(ticket_number)
# Set source items
source = select_source(backup_prefix)
items = scan_source(source, dest) items = scan_source(source, dest)
# Transfer # Transfer
clear_screen() clear_screen()
print_info('Transfer Details:\n') print_info('Transfer Details:\n')
show_data('Ticket:', ticket_number) if ENABLED_TICKET_NUMBERS:
show_data('Ticket:', ticket_number)
show_data('Source:', source.path) show_data('Source:', source.path)
show_data('Destination:', dest) show_data('Destination:', dest)

View file

@ -1,25 +1,27 @@
[Added Associations] [Added Associations]
application/pdf=mupdf.desktop; application/pdf=evince.desktop;
application/vnd.adobe.flash.movie=mpv.desktop; application/vnd.adobe.flash.movie=mpv.desktop;
application/vnd.ms-asf=mpv.desktop; application/vnd.ms-asf=mpv.desktop;
application/x-desktop=leafpad.desktop;
audio/flac=mpv.desktop; audio/flac=mpv.desktop;
audio/mp4=mpv.desktop; audio/mp4=mpv.desktop;
audio/mpeg=mpv.desktop; audio/mpeg=mpv.desktop;
audio/x-vorbis+ogg=mpv.desktop; audio/x-vorbis+ogg=mpv.desktop;
image/bmp=ristretto.desktop; image/bmp=gpicview.desktop;
image/gif=ristretto.desktop; image/gif=gpicview.desktop;
image/jpeg=ristretto.desktop; image/jpeg=gpicview.desktop;
image/png=ristretto.desktop; image/png=gpicview.desktop;
image/vnd.microsoft.icon=ristretto.desktop; image/vnd.microsoft.icon=gpicview.desktop;
inode/directory=exo-file-manager.desktop inode/directory=exo-file-manager.desktop
text/plain=mousepad.desktop; text/plain=leafpad.desktop;
text/x-log=leafpad.desktop;
video/mp4=mpv.desktop; video/mp4=mpv.desktop;
video/mpeg=mpv.desktop; video/mpeg=mpv.desktop;
video/quicktime=mpv.desktop; video/quicktime=mpv.desktop;
video/x-flv=mpv.desktop; video/x-flv=mpv.desktop;
video/x-matroska=mpv.desktop; video/x-matroska=mpv.desktop;
video/x-msvideo=mpv.desktop;
video/x-ms-wmv=mpv.desktop; video/x-ms-wmv=mpv.desktop;
video/x-msvideo=mpv.desktop;
x-scheme-handler/http=exo-web-browser.desktop x-scheme-handler/http=exo-web-browser.desktop
x-scheme-handler/https=exo-web-browser.desktop x-scheme-handler/https=exo-web-browser.desktop
x-scheme-handler/trash=exo-file-manager.desktop x-scheme-handler/trash=exo-file-manager.desktop

View file

@ -1,6 +1,7 @@
aic94xx-firmware aic94xx-firmware
alsa-utils alsa-utils
antiword antiword
arandr
arc-gtk-theme arc-gtk-theme
bash-pipes bash-pipes
bc bc
@ -12,16 +13,19 @@ cmatrix
colordiff colordiff
compton compton
conky conky
cpio
curl curl
dmidecode dmidecode
dos2unix dos2unix
dunst dunst
e2fsprogs e2fsprogs
evince
feh feh
ffmpeg ffmpeg
firefox firefox
gnome-keyring gnome-keyring
gparted gparted
gpicview-gtk3
gsmartcontrol gsmartcontrol
hardinfo hardinfo
hexedit hexedit
@ -33,17 +37,18 @@ i3status
inxi inxi
ldns ldns
leafpad leafpad
lha
libewf libewf
libinput libinput
linux-firmware linux-firmware
lm_sensors lm_sensors
lzip
mdadm mdadm
mediainfo mediainfo
mesa-demos mesa-demos
mkvtoolnix-cli mkvtoolnix-cli
mprime mprime
mpv mpv
mupdf
ncdu ncdu
network-manager-applet network-manager-applet
networkmanager networkmanager
@ -80,6 +85,8 @@ ttf-inconsolata
udevil udevil
udisks2 udisks2
ufw ufw
unarj
unrar
unzip unzip
util-linux util-linux
veracrypt veracrypt
@ -89,6 +96,7 @@ virtualbox-guest-utils
volumeicon volumeicon
wd719x-firmware wd719x-firmware
wimlib wimlib
xarchiver
xf86-input-libinput xf86-input-libinput
xf86-video-amdgpu xf86-video-amdgpu
xf86-video-fbdev xf86-video-fbdev
@ -99,4 +107,5 @@ xorg-xdpyinfo
xorg-xev xorg-xev
xorg-xinit xorg-xinit
xorg-xinput xorg-xinput
zip
zsh zsh