Moved tmux pane logic into State objects
This commit is contained in:
parent
0182777f56
commit
d1f8307153
2 changed files with 147 additions and 150 deletions
|
|
@ -360,6 +360,93 @@ class RecoveryState():
|
||||||
min_percent = min(min_percent, b_p.rescued_percent)
|
min_percent = min(min_percent, b_p.rescued_percent)
|
||||||
return min_percent
|
return min_percent
|
||||||
|
|
||||||
|
def fix_tmux_panes(self, forced=False):
|
||||||
|
"""Fix pane sizes if the winodw has been resized."""
|
||||||
|
needs_fixed = False
|
||||||
|
|
||||||
|
# Check layout
|
||||||
|
for k, v in TMUX_LAYOUT.items():
|
||||||
|
if not v.get('Check'):
|
||||||
|
# Not concerned with the size of this pane
|
||||||
|
continue
|
||||||
|
# Get target
|
||||||
|
target = None
|
||||||
|
if k != 'Current':
|
||||||
|
if k not in self.panes:
|
||||||
|
# Skip missing panes
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
target = self.panes[k]
|
||||||
|
|
||||||
|
# Check pane size
|
||||||
|
x, y = tmux_get_pane_size(pane_id=target)
|
||||||
|
if v.get('x', False) and v['x'] != x:
|
||||||
|
needs_fixed = True
|
||||||
|
if v.get('y', False) and v['y'] != y:
|
||||||
|
needs_fixed = True
|
||||||
|
|
||||||
|
# Bail?
|
||||||
|
if not needs_fixed and not forced:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Remove Destination pane (temporarily)
|
||||||
|
tmux_kill_pane(self.panes['Destination'])
|
||||||
|
|
||||||
|
# Update layout
|
||||||
|
for k, v in TMUX_LAYOUT.items():
|
||||||
|
# Get target
|
||||||
|
target = None
|
||||||
|
if k != 'Current':
|
||||||
|
if k not in self.panes:
|
||||||
|
# Skip missing panes
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
target = self.panes[k]
|
||||||
|
|
||||||
|
# Resize pane
|
||||||
|
tmux_resize_pane(pane_id=target, **v)
|
||||||
|
|
||||||
|
# Calc Source/Destination pane sizes
|
||||||
|
width, height = tmux_get_pane_size()
|
||||||
|
width = int(width / 2) - 1
|
||||||
|
|
||||||
|
# Update Source string
|
||||||
|
source_str = self.source.name
|
||||||
|
if len(source_str) > width:
|
||||||
|
source_str = '{}...'.format(source_str[:width-3])
|
||||||
|
|
||||||
|
# Update Destination string
|
||||||
|
dest_str = self.dest.name
|
||||||
|
if len(dest_str) > width:
|
||||||
|
if self.mode == 'clone':
|
||||||
|
dest_str = '{}...'.format(dest_str[:width-3])
|
||||||
|
else:
|
||||||
|
dest_str = '...{}'.format(dest_str[-width+3:])
|
||||||
|
|
||||||
|
# Rebuild Source/Destination panes
|
||||||
|
tmux_update_pane(
|
||||||
|
pane_id=self.panes['Source'],
|
||||||
|
text='{BLUE}Source{CLEAR}\n{s}'.format(
|
||||||
|
s=source_str, **COLORS))
|
||||||
|
self.panes['Destination'] = tmux_split_window(
|
||||||
|
percent=50, target_pane=self.panes['Source'],
|
||||||
|
text='{BLUE}Destination{CLEAR}\n{s}'.format(
|
||||||
|
s=dest_str, **COLORS))
|
||||||
|
|
||||||
|
if 'SMART' in self.panes:
|
||||||
|
# Calc SMART/ddrescue/Journal panes sizes
|
||||||
|
ratio = [12, 22, 4]
|
||||||
|
width, height = tmux_get_pane_size(pane_id=self.panes['Progress'])
|
||||||
|
height -= 2
|
||||||
|
total = sum(ratio)
|
||||||
|
p_ratio = [int((x/total) * height) for x in ratio]
|
||||||
|
p_ratio[1] = height - p_ratio[0] - p_ratio[2]
|
||||||
|
|
||||||
|
# Resize SMART/Journal panes
|
||||||
|
tmux_resize_pane(self.panes['SMART'], y=ratio[0])
|
||||||
|
tmux_resize_pane(y=ratio[1])
|
||||||
|
tmux_resize_pane(self.panes['Journal'], y=ratio[2])
|
||||||
|
|
||||||
def get_smart_source(self):
|
def get_smart_source(self):
|
||||||
"""Get source for SMART dispay."""
|
"""Get source for SMART dispay."""
|
||||||
disk_path = self.source.path
|
disk_path = self.source.path
|
||||||
|
|
@ -537,94 +624,6 @@ def double_confirm_clone():
|
||||||
return ask('Asking again to confirm, is this correct?')
|
return ask('Asking again to confirm, is this correct?')
|
||||||
|
|
||||||
|
|
||||||
def fix_tmux_panes(state, forced=False):
|
|
||||||
"""Fix pane sizes if the winodw has been resized."""
|
|
||||||
needs_fixed = False
|
|
||||||
|
|
||||||
# Check layout
|
|
||||||
for k, v in TMUX_LAYOUT.items():
|
|
||||||
if not v.get('Check'):
|
|
||||||
# Not concerned with the size of this pane
|
|
||||||
continue
|
|
||||||
# Get target
|
|
||||||
target = None
|
|
||||||
if k != 'Current':
|
|
||||||
if k not in state.panes:
|
|
||||||
# Skip missing panes
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
target = state.panes[k]
|
|
||||||
|
|
||||||
# Check pane size
|
|
||||||
x, y = tmux_get_pane_size(pane_id=target)
|
|
||||||
if v.get('x', False) and v['x'] != x:
|
|
||||||
needs_fixed = True
|
|
||||||
if v.get('y', False) and v['y'] != y:
|
|
||||||
needs_fixed = True
|
|
||||||
|
|
||||||
# Bail?
|
|
||||||
if not needs_fixed and not forced:
|
|
||||||
return
|
|
||||||
|
|
||||||
# Remove Destination pane (temporarily)
|
|
||||||
tmux_kill_pane(state.panes['Destination'])
|
|
||||||
|
|
||||||
# Update layout
|
|
||||||
for k, v in TMUX_LAYOUT.items():
|
|
||||||
# Get target
|
|
||||||
target = None
|
|
||||||
if k != 'Current':
|
|
||||||
if k not in state.panes:
|
|
||||||
# Skip missing panes
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
target = state.panes[k]
|
|
||||||
|
|
||||||
# Resize pane
|
|
||||||
tmux_resize_pane(pane_id=target, **v)
|
|
||||||
|
|
||||||
# Calc Source/Destination pane sizes
|
|
||||||
width, height = tmux_get_pane_size()
|
|
||||||
width = int(width / 2) - 1
|
|
||||||
|
|
||||||
# Update Source string
|
|
||||||
source_str = state.source.name
|
|
||||||
if len(source_str) > width:
|
|
||||||
source_str = '{}...'.format(source_str[:width-3])
|
|
||||||
|
|
||||||
# Update Destination string
|
|
||||||
dest_str = state.dest.name
|
|
||||||
if len(dest_str) > width:
|
|
||||||
if state.mode == 'clone':
|
|
||||||
dest_str = '{}...'.format(dest_str[:width-3])
|
|
||||||
else:
|
|
||||||
dest_str = '...{}'.format(dest_str[-width+3:])
|
|
||||||
|
|
||||||
# Rebuild Source/Destination panes
|
|
||||||
tmux_update_pane(
|
|
||||||
pane_id=state.panes['Source'],
|
|
||||||
text='{BLUE}Source{CLEAR}\n{s}'.format(
|
|
||||||
s=source_str, **COLORS))
|
|
||||||
state.panes['Destination'] = tmux_split_window(
|
|
||||||
percent=50, target_pane=state.panes['Source'],
|
|
||||||
text='{BLUE}Destination{CLEAR}\n{s}'.format(
|
|
||||||
s=dest_str, **COLORS))
|
|
||||||
|
|
||||||
if 'SMART' in state.panes:
|
|
||||||
# Calc SMART/ddrescue/Journal panes sizes
|
|
||||||
ratio = [12, 22, 4]
|
|
||||||
width, height = tmux_get_pane_size(pane_id=state.panes['Progress'])
|
|
||||||
height -= 2
|
|
||||||
total = sum(ratio)
|
|
||||||
p_ratio = [int((x/total) * height) for x in ratio]
|
|
||||||
p_ratio[1] = height - p_ratio[0] - p_ratio[2]
|
|
||||||
|
|
||||||
# Resize SMART/Journal panes
|
|
||||||
tmux_resize_pane(state.panes['SMART'], y=ratio[0])
|
|
||||||
tmux_resize_pane(y=ratio[1])
|
|
||||||
tmux_resize_pane(state.panes['Journal'], y=ratio[2])
|
|
||||||
|
|
||||||
|
|
||||||
def get_device_details(dev_path):
|
def get_device_details(dev_path):
|
||||||
"""Get device details via lsblk, returns JSON dict."""
|
"""Get device details via lsblk, returns JSON dict."""
|
||||||
cmd = ['lsblk', '--json', '--output-all', '--paths', dev_path]
|
cmd = ['lsblk', '--json', '--output-all', '--paths', dev_path]
|
||||||
|
|
@ -816,7 +815,7 @@ def menu_ddrescue(source_path, dest_path, run_mode):
|
||||||
|
|
||||||
# Main menu
|
# Main menu
|
||||||
state.build_outer_panes()
|
state.build_outer_panes()
|
||||||
fix_tmux_panes(state, forced=True)
|
state.fix_tmux_panes(forced=True)
|
||||||
menu_main(state)
|
menu_main(state)
|
||||||
|
|
||||||
# Done
|
# Done
|
||||||
|
|
@ -1032,7 +1031,7 @@ def run_ddrescue(state, pass_settings):
|
||||||
command=['sudo', 'journalctl', '-f'])
|
command=['sudo', 'journalctl', '-f'])
|
||||||
|
|
||||||
# Fix layout
|
# Fix layout
|
||||||
fix_tmux_panes(state, forced=True)
|
state.fix_tmux_panes(forced=True)
|
||||||
|
|
||||||
# Run pass for each block-pair
|
# Run pass for each block-pair
|
||||||
for b_p in state.block_pairs:
|
for b_p in state.block_pairs:
|
||||||
|
|
@ -1078,7 +1077,7 @@ def run_ddrescue(state, pass_settings):
|
||||||
update_sidepane(state)
|
update_sidepane(state)
|
||||||
|
|
||||||
# Fix panes
|
# Fix panes
|
||||||
fix_tmux_panes(state)
|
state.fix_tmux_panes()
|
||||||
|
|
||||||
# Check if ddrescue has finished
|
# Check if ddrescue has finished
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
|
|
@ -558,6 +558,62 @@ class State():
|
||||||
lines=SIDE_PANE_WIDTH,
|
lines=SIDE_PANE_WIDTH,
|
||||||
watch=self.progress_out)
|
watch=self.progress_out)
|
||||||
|
|
||||||
|
def fix_tmux_panes(self):
|
||||||
|
"""Fix pane sizes if the window has been resized."""
|
||||||
|
needs_fixed = False
|
||||||
|
|
||||||
|
# Bail?
|
||||||
|
if not self.panes:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Check layout
|
||||||
|
for k, v in self.tmux_layout.items():
|
||||||
|
if not v.get('Check'):
|
||||||
|
# Not concerned with the size of this pane
|
||||||
|
continue
|
||||||
|
# Get target
|
||||||
|
target = None
|
||||||
|
if k != 'Current':
|
||||||
|
if k not in self.panes:
|
||||||
|
# Skip missing panes
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
target = self.panes[k]
|
||||||
|
|
||||||
|
# Check pane size
|
||||||
|
x, y = tmux_get_pane_size(pane_id=target)
|
||||||
|
if v.get('x', False) and v['x'] != x:
|
||||||
|
needs_fixed = True
|
||||||
|
if v.get('y', False) and v['y'] != y:
|
||||||
|
needs_fixed = True
|
||||||
|
|
||||||
|
# Bail?
|
||||||
|
if not needs_fixed:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Update layout
|
||||||
|
for k, v in self.tmux_layout.items():
|
||||||
|
# Get target
|
||||||
|
target = None
|
||||||
|
if k != 'Current':
|
||||||
|
if k not in self.panes:
|
||||||
|
# Skip missing panes
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
target = self.panes[k]
|
||||||
|
|
||||||
|
# Resize pane
|
||||||
|
tmux_resize_pane(pane_id=target, **v)
|
||||||
|
|
||||||
|
def fix_tmux_panes_loop(self):
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
self.fix_tmux_panes()
|
||||||
|
sleep(1)
|
||||||
|
except RuntimeError:
|
||||||
|
# Assuming layout definitions changes mid-run, ignoring
|
||||||
|
pass
|
||||||
|
|
||||||
def init(self):
|
def init(self):
|
||||||
"""Remove test objects, set log, and add devices."""
|
"""Remove test objects, set log, and add devices."""
|
||||||
self.disks = []
|
self.disks = []
|
||||||
|
|
@ -603,7 +659,7 @@ class State():
|
||||||
|
|
||||||
# Start tmux thread
|
# Start tmux thread
|
||||||
self.tmux_layout = TMUX_LAYOUT.copy()
|
self.tmux_layout = TMUX_LAYOUT.copy()
|
||||||
start_thread(fix_tmux_panes_loop, args=[self])
|
start_thread(self.fix_tmux_panes_loop)
|
||||||
|
|
||||||
def set_top_pane_text(self, text):
|
def set_top_pane_text(self, text):
|
||||||
"""Set top pane text using TOP_PANE_TEXT and provided text."""
|
"""Set top pane text using TOP_PANE_TEXT and provided text."""
|
||||||
|
|
@ -663,64 +719,6 @@ def build_status_string(label, status, info_label=False):
|
||||||
**COLORS)
|
**COLORS)
|
||||||
|
|
||||||
|
|
||||||
def fix_tmux_panes_loop(state):
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
fix_tmux_panes(state)
|
|
||||||
sleep(1)
|
|
||||||
except RuntimeError:
|
|
||||||
# Assuming layout definitions changes mid-run, ignoring
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def fix_tmux_panes(state):
|
|
||||||
"""Fix pane sizes if the window has been resized."""
|
|
||||||
needs_fixed = False
|
|
||||||
|
|
||||||
# Bail?
|
|
||||||
if not state.panes:
|
|
||||||
return
|
|
||||||
|
|
||||||
# Check layout
|
|
||||||
for k, v in state.tmux_layout.items():
|
|
||||||
if not v.get('Check'):
|
|
||||||
# Not concerned with the size of this pane
|
|
||||||
continue
|
|
||||||
# Get target
|
|
||||||
target = None
|
|
||||||
if k != 'Current':
|
|
||||||
if k not in state.panes:
|
|
||||||
# Skip missing panes
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
target = state.panes[k]
|
|
||||||
|
|
||||||
# Check pane size
|
|
||||||
x, y = tmux_get_pane_size(pane_id=target)
|
|
||||||
if v.get('x', False) and v['x'] != x:
|
|
||||||
needs_fixed = True
|
|
||||||
if v.get('y', False) and v['y'] != y:
|
|
||||||
needs_fixed = True
|
|
||||||
|
|
||||||
# Bail?
|
|
||||||
if not needs_fixed:
|
|
||||||
return
|
|
||||||
|
|
||||||
# Update layout
|
|
||||||
for k, v in state.tmux_layout.items():
|
|
||||||
# Get target
|
|
||||||
target = None
|
|
||||||
if k != 'Current':
|
|
||||||
if k not in state.panes:
|
|
||||||
# Skip missing panes
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
target = state.panes[k]
|
|
||||||
|
|
||||||
# Resize pane
|
|
||||||
tmux_resize_pane(pane_id=target, **v)
|
|
||||||
|
|
||||||
|
|
||||||
def generate_horizontal_graph(rates, oneline=False):
|
def generate_horizontal_graph(rates, oneline=False):
|
||||||
"""Generate horizontal graph from rates, returns list."""
|
"""Generate horizontal graph from rates, returns list."""
|
||||||
graph = ['', '', '', '']
|
graph = ['', '', '', '']
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue