sdlan-lib-rs/src/utils/command.rs
2026-03-12 11:40:56 +08:00

139 lines
3.5 KiB
Rust
Executable File

use structopt::StructOpt;
use clap::{Parser, Subcommand, Args};
const APP_TOKEN_ENV_NAME: &str = "PUNCH_TOKEN";
const APP_USER_ENV_NAME: &str = "PUNCH_USER";
const APP_PASS_ENV_NAME: &str = "PUNCH_PASS";
#[derive(Parser, Debug)]
pub struct CommandLineInput2 {
#[command(subcommand)]
pub cmd: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Login(UserLogin),
TokenLogin(TokenLogin),
/// if logined in, just start,
/// else, use the token to login, and start
AutoRun(TokenLogin),
/// after login, we can use start to
/// connect to the remote
Start,
Info,
/// exits the
Stop,
}
#[derive(Args, Debug)]
pub struct UserLogin {
#[arg(short, long, env = APP_USER_ENV_NAME)]
pub username: String,
#[arg(short, long, env = APP_PASS_ENV_NAME, required=false)]
pub password: String,
}
#[derive(Args, Debug)]
pub struct TokenLogin {
#[arg(long, env=APP_TOKEN_ENV_NAME, required=false)]
pub token: String,
}
#[derive(StructOpt, Debug)]
pub struct CommandLineInput {
#[structopt(short="u", long = "user", default_value = "", help="specify a token")]
pub user: String,
#[structopt(short="P", long = "pass", default_value = "", help="specify a token")]
pub pass: String,
#[structopt(short="t", long = "token", default_value = "", help="specify a token")]
pub token: String,
#[structopt(short = "p", long = "port", default_value = "0", help="which port to use")]
pub port: u16,
#[structopt(short= "h", long = "hostname", default_value="", help="specify the hostname")]
pub hostname: String,
}
#[derive(StructOpt, Debug)]
pub struct CommandLine {
#[structopt(short = "s", long = "sn", default_value = "127.0.0.1:7655")]
pub sn: String,
#[structopt(short = "t", long = "tcp", default_value = "127.0.0.1:7656")]
pub quic: String,
/// in the format of "localhost:1234"
#[structopt(long = "nat1")]
pub nat_server1: String,
/// in the format of "localhost:1234"
#[structopt(long = "nat2")]
pub nat_server2: String,
#[structopt(short = "r")]
pub _allow_routing: bool,
#[structopt(short = "dm")]
pub _drop_multicast: bool,
#[structopt(
help = "ttl of the register udp4 packet",
short = "L",
default_value = "1"
)]
pub register_ttl: u8,
#[structopt(help = "mtu of the tun", short = "m", default_value = "1290")]
pub mtu: u32,
#[structopt(short = "n", long = "name", default_value = "test-name")]
pub name: String,
#[structopt(long = "tos", default_value = "0")]
pub tos: u32,
// #[structopt(long = "token", default_value = "")]
// pub token: String,
// #[structopt(long = "code", default_value = "")]
// pub network_code: String,
#[structopt(short = "p")]
pub allow_p2p: bool,
#[structopt(short = "l")]
pub local_port: u16,
}
impl Clone for CommandLine {
fn clone(&self) -> Self {
Self {
sn: self.sn.clone(),
quic: self.quic.clone(),
_allow_routing: self._allow_routing,
_drop_multicast: self._drop_multicast,
register_ttl: self.register_ttl,
mtu: self.mtu,
local_port: self.local_port,
name: self.name.clone(),
tos: self.tos,
// token: self.token.clone(),
// network_code: self.network_code.clone(),
allow_p2p: self.allow_p2p,
nat_server1: self.nat_server1.clone(),
nat_server2: self.nat_server2.clone(),
}
}
}