Merge branch 'dev' of github.com:2Shirt/WizardKit into dev
This commit is contained in:
commit
3285a640c7
17 changed files with 187 additions and 83 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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']))
|
||||||
|
|
|
||||||
|
|
@ -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:',
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue