use tracing_subscriber::{self, EnvFilter};
use clap::Parser;
use crate::gateway::{Gateway, GatewayConfig};
use aivpn_common::error::Result;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct ServerArgs {
#[arg(short, long, default_value = "0.0.0.0:443")]
pub listen: String,
#[arg(long)]
pub tun_name: Option<String>,
#[arg(long)]
pub key_file: Option<String>,
#[arg(short, long)]
pub config: Option<String>,
#[arg(long, default_value = "/etc/aivpn/clients.json")]
pub clients_db: String,
#[arg(long, value_name = "NAME")]
pub add_client: Option<String>,
#[arg(long, value_name = "ID")]
pub remove_client: Option<String>,
#[arg(long)]
pub list_clients: bool,
#[arg(long, value_name = "ID")]
pub show_client: Option<String>,
#[arg(long, env = "AIVPN_SERVER_IP")]
pub server_ip: Option<String>,
#[arg(long, env = "AIVPN_PER_IP_PPS_LIMIT", default_value_t = 50000)]
pub per_ip_pps_limit: u64,
#[arg(long, env = "AIVPN_MASK_DIR")]
pub mask_dir: Option<String>,
#[cfg(all(feature = "management-api", unix))]
#[arg(long, env = "AIVPN_MANAGEMENT_SOCKET")]
pub management_socket: Option<String>,
}
pub struct AivpnServer {
gateway: Gateway,
}
impl AivpnServer {
pub fn new(config: GatewayConfig) -> Result<Self> {
let gateway = Gateway::new(config)?;
Ok(Self { gateway })
}
pub async fn run(self) -> Result<()> {
self.gateway.run().await
}
}
pub fn init_logging() {
tracing_subscriber::fmt()
.with_env_filter(
EnvFilter::from_default_env()
.add_directive("aivpn_server=debug".parse().unwrap())
.add_directive("aivpn_common=debug".parse().unwrap()),
)
.init();
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_server_creation() {
let mask_dir = std::path::PathBuf::from("/tmp/aivpn-test-server-masks");
let _ = std::fs::create_dir_all(&mask_dir);
let mask = aivpn_common::mask::preset_masks::webrtc_zoom_v3();
let json = serde_json::to_string_pretty(&mask).unwrap();
std::fs::write(mask_dir.join(format!("{}.json", mask.mask_id)), &json).unwrap();
std::fs::write(mask_dir.join(format!("{}.stats", mask.mask_id)), "{}").unwrap();
let mut config = GatewayConfig::default();
config.mask_dir = mask_dir;
let server = AivpnServer::new(config);
assert!(server.is_ok());
}
}