Fix Tokio runtime panic when opening log stream
This commit is contained in:
parent
100397f028
commit
c7049d5eb2
2 changed files with 12 additions and 4 deletions
13
src/app.rs
13
src/app.rs
|
|
@ -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() },
|
||||||
|
|
|
||||||
|
|
@ -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()?;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue