upgrade clap module

This commit is contained in:
ssrlive 2023-03-20 14:13:06 +08:00
parent 25d775af47
commit 973f7225e8
3 changed files with 39 additions and 57 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
.*
/target /target
Cargo.lock Cargo.lock

View file

@ -5,8 +5,8 @@ name = "tun2proxy"
version = "0.1.1" version = "0.1.1"
[dependencies] [dependencies]
clap = "3.2" clap = { version = "4.1", features = ["derive"] }
mio = { version = "0.8", features = ["os-poll", "net", "os-ext"] } mio = { version = "0.8", features = ["os-poll", "net", "os-ext"] }
smoltcp = { version = "0.8", features = ["std"] } smoltcp = { version = "0.8", features = ["std"] }
log = "0.4" log = "0.4"
env_logger = "0.9" env_logger = "0.10"

View file

@ -5,68 +5,49 @@ mod virtdevice;
use crate::http::HttpManager; use crate::http::HttpManager;
use crate::tun2proxy::TunToProxy; use crate::tun2proxy::TunToProxy;
use clap::{Parser, ValueEnum};
use env_logger::Env; use env_logger::Env;
use socks5::*; use socks5::*;
use std::net::ToSocketAddrs; use std::net::SocketAddr;
/// Tunnel interface to proxy
#[derive(Parser)]
#[command(author, version, about = "Tunnel interface to proxy.", long_about = None)]
struct Args {
/// Name of the tun interface
#[arg(short, long)]
tun: String,
/// What proxy type to run
#[arg(short, long = "proxy", value_enum)]
proxy_type: ProxyType,
/// Server address with format IP:PORT
#[clap(short, long)]
addr: SocketAddr,
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
enum ProxyType {
/// SOCKS5 server to use
Socks5,
/// HTTP server to use
Http,
}
fn main() { fn main() {
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
let matches = clap::App::new(env!("CARGO_PKG_NAME")) let args = Args::parse();
.version(env!("CARGO_PKG_VERSION"))
.about("Tunnel interface to proxy.")
.arg(
clap::Arg::with_name("tun")
.short('t')
.long("tun")
.value_name("TUN")
.help("Name of the tun interface")
.required(true)
.takes_value(true),
)
.arg(
clap::Arg::with_name("socks5_server")
.help("SOCKS5 server to use")
.short('s')
.long("socks5")
.value_name("IP:PORT"),
)
.arg(
clap::Arg::with_name("http_server")
.help("HTTP server to use")
.short('h')
.long("http")
.value_name("IP:PORT"),
)
.get_matches();
if matches.value_of("socks5_server").is_some() && matches.value_of("http_server").is_some() let mut ttp = TunToProxy::new(&args.tun);
|| matches.value_of("socks5_server").is_none() && matches.value_of("http_server").is_none() match args.proxy_type {
{ ProxyType::Socks5 => {
eprintln!("You need to specify exactly one server."); log::info!("SOCKS5 server: {}", args.addr);
return; ttp.add_connection_manager(Box::new(Socks5Manager::new(args.addr)));
} }
ProxyType::Http => {
let tun_name = matches.value_of("tun").unwrap(); log::info!("HTTP server: {}", args.addr);
let mut ttp = TunToProxy::new(tun_name); ttp.add_connection_manager(Box::new(HttpManager::new(args.addr)));
if let Some(addr) = matches.value_of("socks5_server") {
if let Ok(mut servers) = addr.to_socket_addrs() {
let server = servers.next().unwrap();
println!("SOCKS5 server: {}", server);
ttp.add_connection_manager(Box::new(Socks5Manager::new(server)));
} else {
eprintln!("Invalid server address.");
return;
}
}
if let Some(addr) = matches.value_of("http_server") {
if let Ok(mut servers) = addr.to_socket_addrs() {
let server = servers.next().unwrap();
println!("HTTP server: {}", server);
ttp.add_connection_manager(Box::new(HttpManager::new(server)));
} else {
eprintln!("Invalid server address.");
return;
} }
} }
ttp.run(); ttp.run();