Refactor Disk Utilization reporting
Results are now shown on screen in addition to the osTicket post.
This commit is contained in:
parent
2aa95fd8db
commit
70bb666fa1
2 changed files with 52 additions and 100 deletions
|
|
@ -1055,12 +1055,6 @@ def show_results(state) -> None:
|
||||||
std.print_report(state.system.generate_cpu_ram_report())
|
std.print_report(state.system.generate_cpu_ram_report())
|
||||||
std.print_standard(' ')
|
std.print_standard(' ')
|
||||||
|
|
||||||
# Drop Disk Utilization reports (only needed for OST)
|
|
||||||
for test_group in state.test_groups:
|
|
||||||
if test_group.name == 'Disk Utilization':
|
|
||||||
for test in test_group.test_objects:
|
|
||||||
test.report = []
|
|
||||||
|
|
||||||
# Disk Tests
|
# Disk Tests
|
||||||
disk_tests_enabled = [
|
disk_tests_enabled = [
|
||||||
group.name for group in state.test_groups if 'Disk' in group.name
|
group.name for group in state.test_groups if 'Disk' in group.name
|
||||||
|
|
|
||||||
|
|
@ -2,116 +2,76 @@
|
||||||
# vim: sts=2 sw=2 ts=2
|
# vim: sts=2 sw=2 ts=2
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
|
|
||||||
from wk import os as wk_os
|
from wk import os as wk_os
|
||||||
from wk.cfg.hw import VOLUME_FAILURE_THRESHOLD, VOLUME_SIZE_THRESHOLD
|
from wk.cfg.hw import (
|
||||||
from wk.std import PLATFORM, GenericError, bytes_to_string
|
VOLUME_FAILURE_THRESHOLD,
|
||||||
|
VOLUME_WARNING_THRESHOLD,
|
||||||
|
VOLUME_SIZE_THRESHOLD,
|
||||||
|
)
|
||||||
|
from wk.std import PLATFORM, bytes_to_string, color_string
|
||||||
|
|
||||||
|
|
||||||
# STATIC VARIABLES
|
# STATIC VARIABLES
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
DEV_INFO = '{dev}... {size}... {filesystem}'
|
|
||||||
MOUNT_INFO = '... Mounted on {mountpoint}... ({used} used, {free} free) {msg}'
|
|
||||||
|
|
||||||
|
|
||||||
# Functions
|
# Functions
|
||||||
def add_child_dev_line(test_obj, child) -> None:
|
def add_dev_line(test_obj, details) -> None:
|
||||||
"""Add child device line to test report."""
|
"""Add device line to test report."""
|
||||||
dev_info = DEV_INFO.format(
|
# TODO: Replace bytes_to_string with wk.hw.disk version ?
|
||||||
dev=child['name'],
|
if details is test_obj.dev:
|
||||||
size=bytes_to_string(child['size']),
|
details = details.raw_details
|
||||||
filesystem=child['fstype'],
|
filesystem = details['fstype']
|
||||||
)
|
report_line = re.sub(r"^/dev/", " ", details['name'])
|
||||||
vol_full = False
|
label = details['label']
|
||||||
|
if label:
|
||||||
|
label = f', "{color_string(label, "CYAN")}"'
|
||||||
|
report_line += f' ({filesystem}{label if label else ""})'
|
||||||
|
|
||||||
# Bail early
|
# Bail early
|
||||||
if not child['mountpoint']:
|
if not filesystem:
|
||||||
test_obj.report.append(dev_info)
|
# Skip devices without a filesystem
|
||||||
|
return
|
||||||
|
if not details['mountpoint']:
|
||||||
|
# Under Linux the volume needs to be mounted to get used space
|
||||||
return
|
return
|
||||||
|
|
||||||
# Get sizes
|
# Get sizes
|
||||||
percent_used = -1
|
percent_used = -1
|
||||||
size = child['size']
|
size = details['size']
|
||||||
try:
|
if PLATFORM == 'Darwin':
|
||||||
if PLATFORM == 'Darwin':
|
size = details['TotalSize']
|
||||||
size = child['TotalSize']
|
free = details['FreeSpace']
|
||||||
free = child['FreeSpace']
|
used = size - free
|
||||||
used = size - free
|
elif PLATFORM == 'Linux':
|
||||||
elif PLATFORM == 'Linux':
|
free = int(details['fsavail']) if details['fsavail'] else -1
|
||||||
free = int(child['fsavail'])
|
used = int(details['fsused']) if details['fsused'] else -1
|
||||||
used = int(child['fsused'])
|
percent_used = (used / size) * 100
|
||||||
if free == 0:
|
|
||||||
raise GenericError('Most likely a false positive.')
|
# Bail early
|
||||||
percent_used = (used / size) * 100
|
if used < 0:
|
||||||
except (GenericError, TypeError):
|
# Only include "real" devices
|
||||||
# Bail early
|
|
||||||
test_obj.report.append(f'{dev_info}... Mounted on {child["mountpoint"]}')
|
|
||||||
return
|
return
|
||||||
|
|
||||||
# Check for failures
|
# Check for failures
|
||||||
if (percent_used >= VOLUME_FAILURE_THRESHOLD
|
if (percent_used >= VOLUME_FAILURE_THRESHOLD
|
||||||
and size >= VOLUME_SIZE_THRESHOLD * 1024**3):
|
and size >= VOLUME_SIZE_THRESHOLD * 1024**3):
|
||||||
test_obj.failed = True
|
test_obj.failed = True
|
||||||
vol_full = True
|
|
||||||
|
|
||||||
# Mount / Size info
|
# Build and color size_line if needed
|
||||||
mount_size_info = MOUNT_INFO.format(
|
color = None
|
||||||
mountpoint=child['mountpoint'],
|
if test_obj.failed:
|
||||||
used=bytes_to_string(used),
|
color = 'RED'
|
||||||
free=bytes_to_string(free),
|
elif percent_used >= VOLUME_WARNING_THRESHOLD:
|
||||||
msg=f'[{percent_used:0.0f}% full]' if vol_full else '',
|
color = 'YELLOW'
|
||||||
)
|
size_line = f'{bytes_to_string(size)}'
|
||||||
|
size_line += f' ({bytes_to_string(used)} used, {percent_used:0.0f}% full)'
|
||||||
|
size_line = color_string(size_line, color)
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
test_obj.report.append(f'{dev_info}{mount_size_info}')
|
test_obj.report.append(f'{report_line} {size_line}')
|
||||||
|
|
||||||
|
|
||||||
def add_root_dev_line(test_obj) -> None:
|
|
||||||
"""Add root device line to test report."""
|
|
||||||
dev = test_obj.dev
|
|
||||||
dev_info= DEV_INFO.format(
|
|
||||||
dev=dev.name,
|
|
||||||
size=bytes_to_string(dev.size),
|
|
||||||
filesystem=dev.filesystem,
|
|
||||||
)
|
|
||||||
vol_full = False
|
|
||||||
|
|
||||||
# Get sizes
|
|
||||||
percent_used = -1
|
|
||||||
size = dev.size
|
|
||||||
try:
|
|
||||||
if PLATFORM == 'Darwin':
|
|
||||||
size = dev.raw_details['TotalSize']
|
|
||||||
free = dev.raw_details['FreeSpace']
|
|
||||||
used = size - free
|
|
||||||
elif PLATFORM == 'Linux':
|
|
||||||
free = int(dev.raw_details['fsavail'])
|
|
||||||
used = int(dev.raw_details['fsused'])
|
|
||||||
if free == 0:
|
|
||||||
raise GenericError('Most likely a false positive.')
|
|
||||||
percent_used = (used / size) * 100
|
|
||||||
except (GenericError, TypeError):
|
|
||||||
# Bail early
|
|
||||||
test_obj.report.append(
|
|
||||||
f'{dev_info}... Mounted on {dev.raw_details["mountpoint"]}',
|
|
||||||
)
|
|
||||||
return
|
|
||||||
|
|
||||||
# Check for failures
|
|
||||||
if percent_used >= VOLUME_FAILURE_THRESHOLD:
|
|
||||||
test_obj.failed = True
|
|
||||||
vol_full = True
|
|
||||||
|
|
||||||
# Mount / Size info
|
|
||||||
mount_size_info = MOUNT_INFO.format(
|
|
||||||
mountpoint=dev.raw_details['mountpoint'],
|
|
||||||
used=bytes_to_string(used),
|
|
||||||
free=bytes_to_string(free),
|
|
||||||
msg=f'[{percent_used:0.0f}% full]' if vol_full else '',
|
|
||||||
)
|
|
||||||
|
|
||||||
# Done
|
|
||||||
test_obj.report.append(f'{dev_info}{mount_size_info}')
|
|
||||||
|
|
||||||
|
|
||||||
def check_volume_utilization(test_obj) -> None:
|
def check_volume_utilization(test_obj) -> None:
|
||||||
|
|
@ -120,14 +80,12 @@ def check_volume_utilization(test_obj) -> None:
|
||||||
|
|
||||||
# Mount all volumes (read only if possible)
|
# Mount all volumes (read only if possible)
|
||||||
mount_all_volumes(test_obj.dev)
|
mount_all_volumes(test_obj.dev)
|
||||||
|
|
||||||
# Add root dev to report
|
|
||||||
add_root_dev_line(test_obj)
|
|
||||||
|
|
||||||
# Add children
|
|
||||||
dev.update_details(skip_children=False)
|
dev.update_details(skip_children=False)
|
||||||
for child in dev.children:
|
|
||||||
add_child_dev_line(test_obj, child)
|
# 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
|
# Update test object
|
||||||
if test_obj.failed:
|
if test_obj.failed:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue