Radish alpha
h
Radicle Heartwood Protocol & Stack
Radicle
Git (anonymous pull)
Log in to clone via SSH
cli: more explicit error message when rad node logs fail
Arnaud Bailly committed 1 year ago
commit 703d3c40241cc136cd90e4f67c016e1e5bf4ec0e
parent f6aa46a283f63025882551a27e6d2145939560f5
1 file changed +11 -9
modified radicle-cli/src/commands/node/control.rs
@@ -3,7 +3,7 @@ use std::fs::{File, OpenOptions};
use std::io::{BufRead, BufReader, Read, Seek, SeekFrom};
use std::{fs, io, path::Path, process, thread, time};

-
use anyhow::anyhow;
+
use anyhow::{anyhow, Context};
use localtime::LocalTime;

use radicle::node;
@@ -128,18 +128,20 @@ pub fn debug(node: &mut Node) -> anyhow::Result<()> {
}

pub fn logs(lines: usize, follow: Option<time::Duration>, profile: &Profile) -> anyhow::Result<()> {
-
    let logs = profile.home.node().join("node.log");
+
    let logs_path = profile.home.node().join("node.log");
+
    let mut reader = File::open(logs_path.clone())
+
        .map(BufReader::new)
+
        .with_context(|| format!("Failed to open logs from {}. If radicle node is run with systemd, check systemd logs.", logs_path.display()))?;

-
    let mut file = BufReader::new(File::open(logs)?);
-
    file.seek(SeekFrom::End(0))?;
+
    reader.seek(SeekFrom::End(0))?;

    let mut tail = Vec::new();
    let mut nlines = 0;

-
    for i in (1..=file.stream_position()?).rev() {
+
    for i in (1..=reader.stream_position()?).rev() {
        let mut buf = [0; 1];
-
        file.seek(SeekFrom::Start(i - 1))?;
-
        file.read_exact(&mut buf)?;
+
        reader.seek(SeekFrom::Start(i - 1))?;
+
        reader.read_exact(&mut buf)?;

        if buf[0] == b'\n' {
            nlines += 1;
@@ -154,13 +156,13 @@ pub fn logs(lines: usize, follow: Option<time::Duration>, profile: &Profile) ->
    print!("{}", term::format::dim(String::from_utf8_lossy(&tail)));

    if let Some(timeout) = follow {
-
        file.seek(SeekFrom::End(0))?;
+
        reader.seek(SeekFrom::End(0))?;

        let start = time::Instant::now();

        while start.elapsed() < timeout {
            let mut line = String::new();
-
            let len = file.read_line(&mut line)?;
+
            let len = reader.read_line(&mut line)?;

            if len == 0 {
                thread::sleep(time::Duration::from_millis(250));