Fix Tokio runtime panic when opening log stream

This commit is contained in:
SW 2026-06-17 21:56:02 +02:00
parent 100397f028
commit c7049d5eb2
2 changed files with 12 additions and 4 deletions

View file

@ -130,6 +130,7 @@ impl LogViewer {
pub struct App { pub struct App {
pub session: SshSession, pub session: SshSession,
pub config: Config, pub config: Config,
pub runtime: tokio::runtime::Handle,
pub logs: Vec<LogSource>, pub logs: Vec<LogSource>,
pub filtered_indices: Vec<usize>, pub filtered_indices: Vec<usize>,
pub selected_index: usize, pub selected_index: usize,
@ -143,10 +144,11 @@ pub struct App {
} }
impl App { impl App {
pub fn new(session: SshSession, config: Config) -> Self { pub fn new(session: SshSession, config: Config, runtime: tokio::runtime::Handle) -> Self {
Self { Self {
session, session,
config, config,
runtime,
logs: Vec::new(), logs: Vec::new(),
filtered_indices: Vec::new(), filtered_indices: Vec::new(),
selected_index: 0, selected_index: 0,
@ -232,7 +234,11 @@ impl App {
let Some(source) = self.selected_log().cloned() else { let Some(source) = self.selected_log().cloned() else {
return Ok(()); return Ok(());
}; };
let rx = start_stream(&self.session, &source, 1000)?; let session = self.session.clone();
let stream_source = source.clone();
let rx = self.runtime.block_on(async move {
start_stream(&session, &stream_source, 1000)
})?;
self.viewer = Some(LogViewer::new(source, rx, self.config.max_log_lines)); self.viewer = Some(LogViewer::new(source, rx, self.config.max_log_lines));
self.screen = Screen::Viewer; self.screen = Screen::Viewer;
self.message = None; self.message = None;
@ -355,7 +361,8 @@ mod tests {
#[test] #[test]
fn test_app_filter() { fn test_app_filter() {
let session = SshSession::new("ssh".into(), crate::ssh::SshTarget { args: vec!["host".into()] }); let session = SshSession::new("ssh".into(), crate::ssh::SshTarget { args: vec!["host".into()] });
let mut app = App::new(session, Config::default()); let rt = tokio::runtime::Runtime::new().unwrap();
let mut app = App::new(session, Config::default(), rt.handle().clone());
app.logs = vec![ app.logs = vec![
LogSource::File { path: "/var/log/syslog".into() }, LogSource::File { path: "/var/log/syslog".into() },
LogSource::File { path: "/opt/app/app.log".into() }, LogSource::File { path: "/opt/app/app.log".into() },

View file

@ -74,9 +74,10 @@ fn main() -> io::Result<()> {
let session = SshSession::new(config.ssh_command.clone(), target); let session = SshSession::new(config.ssh_command.clone(), target);
let rt = Runtime::new()?; let rt = Runtime::new()?;
let runtime_handle = rt.handle().clone();
// Run discovery before entering TUI // Run discovery before entering TUI
let mut app = App::new(session, config); let mut app = App::new(session, config, runtime_handle);
rt.block_on(app.discover()); rt.block_on(app.discover());
enable_raw_mode()?; enable_raw_mode()?;