mirror of
https://codeberg.org/icewind/haze.git
synced 2026-06-03 17:14:08 +02:00
add follow option to log command
This commit is contained in:
parent
a9083843e6
commit
1f438e8e4f
3 changed files with 37 additions and 14 deletions
29
src/args.rs
29
src/args.rs
|
|
@ -36,6 +36,7 @@ pub enum HazeArgs {
|
||||||
Clean,
|
Clean,
|
||||||
Logs {
|
Logs {
|
||||||
filter: Option<String>,
|
filter: Option<String>,
|
||||||
|
follow: bool,
|
||||||
service: Option<LogService>,
|
service: Option<LogService>,
|
||||||
count: Option<usize>,
|
count: Option<usize>,
|
||||||
},
|
},
|
||||||
|
|
@ -168,15 +169,13 @@ impl HazeArgs {
|
||||||
HazeCommand::Clean => Ok(HazeArgs::Clean),
|
HazeCommand::Clean => Ok(HazeArgs::Clean),
|
||||||
HazeCommand::Logs => {
|
HazeCommand::Logs => {
|
||||||
let mut args = args.peekable();
|
let mut args = args.peekable();
|
||||||
|
let follow = args.next_if(|arg| arg.as_ref() == "-f").is_some();
|
||||||
let service = args
|
let service = args
|
||||||
.peek()
|
.next_if(|arg| LogService::from_type(arg.as_ref()).is_some())
|
||||||
.map(|s| s.as_ref())
|
.and_then(|arg| LogService::from_type(arg.as_ref()));
|
||||||
.and_then(LogService::from_type);
|
|
||||||
if service.is_some() {
|
|
||||||
let _ = args.next();
|
|
||||||
}
|
|
||||||
Ok(HazeArgs::Logs {
|
Ok(HazeArgs::Logs {
|
||||||
filter,
|
filter,
|
||||||
|
follow,
|
||||||
service,
|
service,
|
||||||
count: args
|
count: args
|
||||||
.next()
|
.next()
|
||||||
|
|
@ -312,4 +311,22 @@ fn test_arg_parse() {
|
||||||
args: vec!["foo".into(), "bar".into()]
|
args: vec!["foo".into(), "bar".into()]
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
assert_eq!(
|
||||||
|
HazeArgs::parse(vec!["haze", "logs", "-f", "smb"].into_iter()).unwrap(),
|
||||||
|
HazeArgs::Logs {
|
||||||
|
filter: None,
|
||||||
|
follow: true,
|
||||||
|
service: Some(LogService::from_type("smb").unwrap()),
|
||||||
|
count: None,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
HazeArgs::parse(vec!["haze", "asdasd", "logs", "smb", "123"].into_iter()).unwrap(),
|
||||||
|
HazeArgs::Logs {
|
||||||
|
filter: Some("asdasd".to_string()),
|
||||||
|
follow: false,
|
||||||
|
service: Some(LogService::from_type("smb").unwrap()),
|
||||||
|
count: Some(123),
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
15
src/exec.rs
15
src/exec.rs
|
|
@ -145,21 +145,28 @@ pub async fn exec<S1: AsRef<str>, S2: Into<String>>(
|
||||||
.into())
|
.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn container_logs(docker: &Docker, container: &str, count: usize) -> Result<Vec<String>> {
|
pub async fn container_logs(
|
||||||
let mut logs = Vec::new();
|
docker: &Docker,
|
||||||
|
mut std_out: impl Write,
|
||||||
|
container: &str,
|
||||||
|
count: usize,
|
||||||
|
follow: bool,
|
||||||
|
) -> Result<()> {
|
||||||
let mut stream = docker.logs::<String>(
|
let mut stream = docker.logs::<String>(
|
||||||
container,
|
container,
|
||||||
Some(LogsOptions {
|
Some(LogsOptions {
|
||||||
stdout: true,
|
stdout: true,
|
||||||
stderr: true,
|
stderr: true,
|
||||||
|
follow,
|
||||||
tail: format!("{}", count),
|
tail: format!("{}", count),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
while let Some(line) = stream.next().await {
|
while let Some(line) = stream.next().await {
|
||||||
logs.push(line.into_diagnostic()?.to_string());
|
let line = line.into_diagnostic()?.to_string();
|
||||||
|
write!(&mut std_out, "{}", line).into_diagnostic()?;
|
||||||
}
|
}
|
||||||
Ok(logs)
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ExitCode(i64);
|
pub struct ExitCode(i64);
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ use crate::service::Service;
|
||||||
use crate::service::ServiceTrait;
|
use crate::service::ServiceTrait;
|
||||||
use bollard::Docker;
|
use bollard::Docker;
|
||||||
use miette::{IntoDiagnostic, Result, WrapErr};
|
use miette::{IntoDiagnostic, Result, WrapErr};
|
||||||
|
use std::io::stdout;
|
||||||
|
|
||||||
mod args;
|
mod args;
|
||||||
mod cloud;
|
mod cloud;
|
||||||
|
|
@ -154,6 +155,7 @@ async fn main() -> Result<()> {
|
||||||
}
|
}
|
||||||
HazeArgs::Logs {
|
HazeArgs::Logs {
|
||||||
filter,
|
filter,
|
||||||
|
follow,
|
||||||
count,
|
count,
|
||||||
service,
|
service,
|
||||||
} => {
|
} => {
|
||||||
|
|
@ -163,10 +165,7 @@ async fn main() -> Result<()> {
|
||||||
} else {
|
} else {
|
||||||
cloud.id
|
cloud.id
|
||||||
};
|
};
|
||||||
let logs = container_logs(&docker, &container, count.unwrap_or(20)).await?;
|
container_logs(&docker, stdout(), &container, count.unwrap_or(20), follow).await?;
|
||||||
for log in logs {
|
|
||||||
print!("{}", log);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
HazeArgs::Exec {
|
HazeArgs::Exec {
|
||||||
filter,
|
filter,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue