use anyhow::Result;
use clap::{Parser, Subcommand};
use tracing::info;
mod client;
mod tunnel;
mod web;
#[derive(Parser, Debug)]
#[command(author, version, about = "Share your terminal session via a web link.")]
struct Args {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand, Debug)]
enum Commands {
Connect(client::Args),
Tunnel(tunnel::Args),
Web(web::Args),
}
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
let home_dir = std::env::var("HOME").unwrap_or_else(|_| ".".to_string());
let tshare_dir = format!("{home_dir}/.tshare");
std::fs::create_dir_all(&tshare_dir)?;
let (log_path, console_output) = match &args.command {
Commands::Connect(_) => (format!("{tshare_dir}/tshare.log"), false), Commands::Tunnel(_) => (format!("{tshare_dir}/tshare-tunnel.log"), true), Commands::Web(_) => (format!("{tshare_dir}/tshare-web.log"), true),
};
let _ = std::fs::remove_file(&log_path);
let log_file = std::fs::OpenOptions::new()
.create(true)
.write(true)
.truncate(true)
.open(&log_path)?;
if console_output {
use tracing_subscriber::fmt::writer::MakeWriterExt;
let writer = std::io::stdout.and(log_file);
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
)
.with_writer(writer)
.init();
} else {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
)
.with_writer(log_file)
.with_ansi(false)
.init();
}
match &args.command {
Commands::Connect(_) => {
info!("Starting tshare client");
}
Commands::Tunnel(_) => {
info!("Starting tshare tunnel server");
}
Commands::Web(_) => {
info!("Starting tshare web server");
}
}
match args.command {
Commands::Connect(client_args) => client::run_client(client_args).await,
Commands::Tunnel(tunnel_args) => tunnel::run_tunnel_server(tunnel_args).await,
Commands::Web(web_args) => web::run_web_server(web_args).await,
}
}