diff --git a/Cargo.lock b/Cargo.lock index fef5316..a45099d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,7 +12,6 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" name = "minecraft_proxy" version = "0.1.0" dependencies = [ - "linked-hash-map", "yaml-rust", ] diff --git a/src/conf/mod.rs b/src/conf/mod.rs index ce74e67..3a89a75 100644 --- a/src/conf/mod.rs +++ b/src/conf/mod.rs @@ -3,27 +3,48 @@ use std::fs::File; use std::str::FromStr; use std::io::prelude::*; use std::collections::HashMap; +pub mod server_conf; static FILE: &str = "mrprox.conf"; -pub struct Servers{ +pub struct Config{ l_servers : HashMap, + file: Vec, + port: String, + port_conf: String, } -impl Servers { +impl Config { pub fn new() -> Self { + let mut file = File::open(&FILE).unwrap(); + let mut s = String::new(); + file.read_to_string(&mut s).unwrap(); + let yam = yaml::YamlLoader::load_from_str(&s).unwrap(); Self{ - l_servers: Self::get_servers(), + l_servers: Self::get_servers(&yam), + port: Self::get_port_f(&yam), + port_conf: Self::get_conf_port_f(&yam), + file: yam, } } - fn get_servers() -> HashMap { - let mut f = File::open(&FILE).unwrap(); - let mut s = String::new(); + fn get_port_f(file: &Vec) -> String { + match file[0]["port"].as_str() { + Some(h) => String::from(h), + _ => String::from("25565"), + } + } + + fn get_conf_port_f(file: &Vec) -> String { + match file[0]["port_conf"].as_str() { + Some(h) => String::from(h), + _ => String::from("25565"), + } + } + + fn get_servers(file: &Vec) -> HashMap { let mut ret = HashMap::new(); - f.read_to_string(&mut s).unwrap(); - let docs = yaml::YamlLoader::load_from_str(&s).unwrap(); - let docs2 = match &docs[0]["servers"] { + let docs2 = match file[0]["servers"] { yaml::Yaml::Hash(ref h) => h, _ => return ret, }; @@ -57,4 +78,12 @@ impl Servers { return None; } } + + pub fn get_port(&self) -> &String{ + &self.port + } + + pub fn get_port_conf(&self) -> &String{ + &self.port_conf + } } diff --git a/src/conf/server_conf.rs b/src/conf/server_conf.rs new file mode 100644 index 0000000..ca5eae6 --- /dev/null +++ b/src/conf/server_conf.rs @@ -0,0 +1,36 @@ +use std::net::{TcpListener, TcpStream}; +use std::io::prelude::*; +use crate::conf; +use std::sync::{Arc, RwLock}; + +pub fn server_conf(conf: Arc>){ + let listener = TcpListener::bind(String::from("0.0.0.0:") + + conf.read().unwrap().get_port_conf()).unwrap(); + + + for stream in listener.incoming() { + match stream{ + Ok(s) => process_reques(s), + Err(_e) => println!("{}",_e), + } + } + +} + +fn process_reques(mut stream: TcpStream) { + let mut buf: [u8; 256] = [1; 256]; + match stream.read(&mut buf){ + Ok(len) => check_state(&mut buf, len), + Err(e) => println!("pos no {}", e), + } +} + +fn check_state(buf: &mut [u8; 256], len: usize) { + let var = String::from_utf8(buf[0 .. len-2].to_vec()).unwrap(); + //let var = String::from("some"); + match var.as_str(){ + "some" => println!("entra"), + _=> println!("pos no {}", var), + } + println!("len {}", var.len()); +} diff --git a/src/main.rs b/src/main.rs index 0dede85..f69db40 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,64 +1,18 @@ -use std::net::{TcpListener, TcpStream}; -use std::sync::{Arc, RwLock}; -use std::io::prelude::*; -use crate::client::guard; use std::thread; -use std::time::Duration; - +use conf::server_conf; +use std::sync::{Arc, RwLock}; mod client; mod conf; mod protocol; +mod server_proxy; fn main() { - let listener = TcpListener::bind("0.0.0.0:25565").unwrap(); - let servers = Arc::new(RwLock::new(conf::Servers::new())); - let guard = Arc::new(RwLock::new(guard::Guard::new())); - for stream in listener.incoming() { - if guard.read().unwrap().can_add(){ - match stream { - Ok(stream) => { - let g = guard.clone(); - let s = servers.clone(); - thread::spawn(|| read_connection(stream, s , g)); - }, - - Err(_e) => println!("{}",_e), - } - } - } + let servers = Arc::new(RwLock::new(conf::Config::new())); + let s1 = servers.clone(); + let s2 = servers.clone(); + let stop1 = thread::spawn(|| server_proxy::start_proxy(s1)); + let stop2 = thread::spawn(|| conf::server_conf::server_conf(s2)); + stop1.join(); + stop2.join(); } - -fn read_connection(mut stream: TcpStream, - servers: Arc>, - guard: Arc> ) { - let mut buf: [u8; 256] = [1; 256]; - stream.set_read_timeout(Some(Duration::from_millis(5000))); - let leng = match stream.read(&mut buf) { - Ok(l) => l, - Err(_e) => return, - }; - let hs = protocol::HandShake::new(&mut buf[.. leng]); - if hs.is_handshake() { //Filtra los ping, solo controlamos los handshakes - conect_server(servers, hs, stream, guard); - } - -} - -fn conect_server(servers: Arc>, - mut hs: protocol::HandShake, - stream: TcpStream, - guard: Arc>){ - - match servers.read().unwrap().get_server(&hs.get_host_name()) { - Some(s) => { - hs.replace_port(s.1); - let mut sstream = TcpStream::connect(s.0 + ":" + &s.1.to_string()).unwrap(); - sstream.write(hs.get_raw()); - let c1 = client::Client::new(stream,sstream, hs); - guard.write().unwrap().add_thread(c1.start_proxy()); - }, - None => println!("No server found for {}", hs.get_host_name()) - } -} - diff --git a/src/meson.build b/src/meson.build index e6871b7..04069d7 100644 --- a/src/meson.build +++ b/src/meson.build @@ -5,6 +5,8 @@ minecraft_proxy_sources = [ 'client/guard.rs', 'protocol/mod.rs', 'conf/mod.rs', + 'conf/server_conf.rs', + 'server_proxy.rs', ] minecraft_proxy_deps = [ diff --git a/src/server_proxy.rs b/src/server_proxy.rs new file mode 100644 index 0000000..59e9d84 --- /dev/null +++ b/src/server_proxy.rs @@ -0,0 +1,61 @@ +use std::net::{TcpListener, TcpStream}; +use std::sync::{Arc, RwLock}; +use std::io::prelude::*; +use crate::client::guard; +use crate::client; +use std::thread; +use std::time::Duration; +use crate::protocol; +use crate::conf; + +pub fn start_proxy(servers: Arc>){ + let listener = TcpListener::bind(String::from("0.0.0.0:") + servers.read().unwrap().get_port()).unwrap(); + let guard = Arc::new(RwLock::new(guard::Guard::new())); + for stream in listener.incoming() { + if guard.read().unwrap().can_add(){ + match stream { + Ok(stream) => { + let g = guard.clone(); + let s = servers.clone(); + thread::spawn(|| read_connection(stream, s , g)); + }, + + Err(_e) => println!("{}",_e), + } + } + } +} + +fn read_connection(mut stream: TcpStream, + servers: Arc>, + guard: Arc> ) { + let mut buf: [u8; 256] = [1; 256]; + stream.set_read_timeout(Some(Duration::from_millis(5000))); + let leng = match stream.read(&mut buf) { + Ok(l) => l, + Err(_e) => return, + }; + let hs = protocol::HandShake::new(&mut buf[.. leng]); + if hs.is_handshake() { //Filtra los ping, solo controlamos los handshakes + conect_server(servers, hs, stream, guard); + } + +} + +fn conect_server(servers: Arc>, + mut hs: protocol::HandShake, + stream: TcpStream, + guard: Arc>){ + + match servers.read().unwrap().get_server(&hs.get_host_name()) { + Some(s) => { + hs.replace_port(s.1); + let mut sstream = TcpStream::connect(s.0 + ":" + &s.1.to_string()).unwrap(); + sstream.write(hs.get_raw()); + let c1 = client::Client::new(stream,sstream, hs); + guard.write().unwrap().add_thread(c1.start_proxy()); + }, + None => println!("No server found for {}", hs.get_host_name()) + } +} +