#[macro_use]
extern crate log;
use clap::Parser;
use pasque::{
UdpEndpoint,
IpEndpoint,
PsqServer,
server::Config,
};
#[tokio::main]
async fn main() {
env_logger::builder().format_timestamp_nanos().init();
let args = Args::new();
let config = match Config::read_from_file(args.config()) {
Ok(c) => c,
Err(e) => {
warn!(
"Could not read config '{}': {}. Applying default configuration.",
args.config(),
e,
);
Config::create_default()
}
};
let mut psqserver = PsqServer::start(
"0.0.0.0:4433",
&config,
).await.unwrap();
if args.ip().len() > 0 {
psqserver.add_endpoint("ip",
IpEndpoint::new(
args.ip(),
"tun-s",
).unwrap()
).await;
}
psqserver.add_endpoint("udp",
UdpEndpoint::new().unwrap()
).await;
loop {
psqserver.process().await.unwrap();
}
}
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
pub struct Args {
#[arg(short, long, default_value = "server.json")]
config: String,
#[arg(short, long, default_value = "")]
ip: String,
}
impl Args {
pub fn new() -> Args {
let args = Args::parse();
args
}
pub fn config(&self) -> &String {
&self.config
}
pub fn ip(&self) -> &String {
&self.ip
}
}