porta-rs 0.1.1

Zero-trust CGNAT bypass via WireGuard tunnel
use anyhow::Result;
use clap::Args;
use std::process::Command;

#[derive(Args)]
pub struct LogsArgs {
    /// Follow logs in real-time
    #[arg(short, long)]
    pub follow: bool,

    /// Filter by log level
    #[arg(short, long)]
    pub filter: Option<String>,

    /// Number of lines to show
    #[arg(short, long, default_value = "100")]
    pub lines: usize,
}

pub fn execute(args: &LogsArgs) -> Result<()> {
    if args.follow {
        println!("\x1b[1;36mFollowing porta logs (Ctrl+C to stop):\x1b[0m\n");

        let mut cmd = Command::new("journalctl");
        cmd.args(["-u", "porta", "-f", "--no-pager"]);

        if let Some(filter) = &args.filter {
            cmd.args(["-p", filter]);
        }

        let status = cmd.status()?;
        if !status.success() {
            println!("Failed to follow logs. Make sure porta service is installed.");
            println!("You can also try: journalctl -u porta -f");
        }
    } else {
        println!("\n\x1b[1;36mRecent Logs (last {} lines):\x1b[0m\n", args.lines);

        let mut cmd = Command::new("journalctl");
        cmd.args(["-u", "porta", "-n"]);
        cmd.arg(&args.lines.to_string());
        cmd.args(["--no-pager"]);

        if let Some(filter) = &args.filter {
            cmd.args(["-p", filter]);
        }

        let status = cmd.status()?;
        if !status.success() {
            println!("Failed to read logs. Make sure porta service is installed.");
            println!("You can also try: journalctl -u porta -n {}", args.lines);
        }
    }

    Ok(())
}