#[macro_use]
extern crate log;
use clap::Parser;
use pasque::{
PsqClient,
IpTunnel,
UdpTunnel,
};
#[tokio::main]
async fn main() {
env_logger::builder().format_timestamp_nanos().init();
let args = Args::new();
let mut psqconn = PsqClient::connect(
args.dest(),
args.ignore_cert(),
).await.unwrap();
if let Some(token) = args.token() {
psqconn.set_token(token.clone());
}
if args.ip() {
match IpTunnel::connect(&mut psqconn,
"ip",
"tun-c",
).await {
Ok(_iptunnel) => {
info!("IpTunnel set up");
},
Err(e) => {
error!("Error connecting IpTunnel: {}", e);
return;
}
}
}
let udptunnel = UdpTunnel::connect(
&mut psqconn,
"udp",
"127.0.0.1",
9000,
"127.0.0.1:0".parse().unwrap(),
).await.unwrap();
println!(
"UDP datagrams to {} are forwarded to HTTP tunnel.",
udptunnel.sockaddr().unwrap(),
);
while psqconn.process().await.is_ok() {
}
}
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
pub struct Args {
#[arg(short, long, default_value = "config.json")]
config: String,
#[arg(short, long)]
dest: String,
#[arg(long, action = clap::ArgAction::SetTrue)]
ignore_cert: bool,
#[arg(short, long, action = clap::ArgAction::SetTrue)]
ip: bool,
#[arg(long)]
token: Option<String>,
}
impl Args {
pub fn new() -> Args {
let args = Args::parse();
args
}
pub fn config(&self) -> &String {
&self.config
}
pub fn dest(&self) -> &String {
&self.dest
}
pub fn ignore_cert(&self) -> bool {
self.ignore_cert
}
pub fn ip(&self) -> bool {
self.ip
}
pub fn token(&self) -> Option<&String> {
self.token.as_ref()
}
}