98 lines
2.7 KiB
Rust
98 lines
2.7 KiB
Rust
use std::{
|
|
env,
|
|
net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
|
|
process::ExitCode,
|
|
};
|
|
|
|
use log::LevelFilter;
|
|
use simplelog::{ColorChoice, ConfigBuilder, TermLogger, TerminalMode};
|
|
|
|
use crate::meteoro::Meteoro;
|
|
|
|
mod bittorrent;
|
|
mod constants;
|
|
mod meteoro;
|
|
mod tracker;
|
|
mod udp_server;
|
|
|
|
fn main() -> ExitCode {
|
|
let args: Vec<String> = env::args().collect();
|
|
|
|
if args.contains(&String::from("--help")) || args.contains(&String::from("-h")) {
|
|
println!("{}", constants::METEORO_HELP_TEXT);
|
|
return ExitCode::SUCCESS;
|
|
}
|
|
|
|
if args.contains(&String::from("--version")) || args.contains(&String::from("-v")) {
|
|
println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
|
|
return ExitCode::SUCCESS;
|
|
}
|
|
|
|
#[cfg(debug_assertions)]
|
|
let mut log_level: LevelFilter = LevelFilter::Trace;
|
|
#[cfg(not(debug_assertions))]
|
|
let mut log_level: LevelFilter = LevelFilter::Info;
|
|
|
|
if args.contains(&String::from("--debug")) {
|
|
log_level = LevelFilter::Debug;
|
|
} else if args.contains(&String::from("--trace")) {
|
|
log_level = LevelFilter::Trace;
|
|
}
|
|
|
|
let logger_config = ConfigBuilder::new()
|
|
.set_target_level(LevelFilter::Trace)
|
|
.set_location_level(LevelFilter::Off)
|
|
.set_thread_level(LevelFilter::Off)
|
|
.set_time_level(LevelFilter::Info)
|
|
.build();
|
|
|
|
TermLogger::init(
|
|
log_level,
|
|
logger_config,
|
|
TerminalMode::Mixed,
|
|
ColorChoice::Auto,
|
|
)
|
|
.expect("failed to initialise terminal logging");
|
|
|
|
let ipv4_flag_idxs: Vec<usize> = args
|
|
.iter()
|
|
.enumerate()
|
|
.filter_map(|(idx, s)| if s == "-a" { Some(idx) } else { None })
|
|
.collect();
|
|
let ipv6_flag_idxs: Vec<usize> = args
|
|
.iter()
|
|
.enumerate()
|
|
.filter_map(|(idx, s)| if s == "-A" { Some(idx) } else { None })
|
|
.collect();
|
|
let mut ip_addrs: Vec<SocketAddr> = ipv4_flag_idxs
|
|
.iter()
|
|
.filter_map(|idx| {
|
|
Some(SocketAddr::V4(
|
|
args.get(*idx + 1)?.parse::<SocketAddrV4>().ok()?,
|
|
))
|
|
})
|
|
.collect();
|
|
ip_addrs.extend(ipv6_flag_idxs.iter().filter_map(|idx| {
|
|
Some(SocketAddr::V6(
|
|
args.get(*idx + 1)?.parse::<SocketAddrV6>().ok()?,
|
|
))
|
|
}));
|
|
|
|
if ip_addrs.is_empty() {
|
|
ip_addrs.push(SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 6969)));
|
|
ip_addrs.push(SocketAddr::V6(SocketAddrV6::new(
|
|
Ipv6Addr::LOCALHOST,
|
|
6969,
|
|
0,
|
|
0,
|
|
)));
|
|
}
|
|
|
|
// bufbuf():codingcodingbuf/
|
|
|
|
return match Meteoro::start(&ip_addrs) {
|
|
Ok(_) => ExitCode::SUCCESS,
|
|
Err(_) => ExitCode::FAILURE,
|
|
};
|
|
}
|