diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/client.rs | 5 | ||||
| -rw-r--r-- | src/client/connector.rs | 23 | ||||
| -rw-r--r-- | src/client/connector/httpconnector.rs | 104 | ||||
| -rw-r--r-- | src/client/main.rs | 70 | ||||
| -rw-r--r-- | src/executor.rs | 18 | ||||
| -rw-r--r-- | src/server/server/tcpserver.rs | 103 | ||||
| -rw-r--r-- | src/server/tasks.rs | 19 | ||||
| -rw-r--r-- | src/tasks.rs | 14 | ||||
| -rw-r--r-- | src/tasks/client.rs | 112 | ||||
| -rw-r--r-- | src/tasks/server.rs | 35 |
10 files changed, 190 insertions, 313 deletions
diff --git a/src/client.rs b/src/client.rs index 845a38a..c07b9fa 100644 --- a/src/client.rs +++ b/src/client.rs @@ -13,8 +13,5 @@ pub struct Client<'a> { pub username: String, pub realname: String, pub langs: Option<Vec<Language>>, - pub env: Vec<( - String, - String, - )>, + pub env: Vec<(String, String)>, } diff --git a/src/client/connector.rs b/src/client/connector.rs index c1a5f7f..aa476aa 100644 --- a/src/client/connector.rs +++ b/src/client/connector.rs @@ -34,24 +34,18 @@ pub trait Connection { fn get_ip(&self) -> Option<IpAddr>; fn force_network(&mut self) { - _ = Executor::new( - NETWORK_T.as_ref(), - ["true"], - (), - ); + _ = Executor::new(NETWORK_T.as_ref(), ["true"], ()); } fn init<'a>(&self, c: &Client<'a, Self>) -> std::result::Result<(), Self::Err> where Self: std::marker::Sized, { - self.ntfy( - format!( - r#"New client: + self.ntfy(format!( + r#"New client: {c} "#, - ), - ) + )) } fn reinit(&mut self) { @@ -98,14 +92,7 @@ pub trait Connection { } Result::Err(e) => { #[cfg(debug_assertions)] - std::eprintln!( - "[{}:{}:{}] {} = {:#?}", - std::file!(), - std::line!(), - std::column!(), - std::stringify!(e), - &&e as &dyn std::fmt::Debug, - ); + std::eprintln!("[{}:{}:{}] {} = {:#?}", std::file!(), std::line!(), std::column!(), std::stringify!(e), &&e as &dyn std::fmt::Debug,); } } } diff --git a/src/client/connector/httpconnector.rs b/src/client/connector/httpconnector.rs index c0dbce0..ac74a7f 100644 --- a/src/client/connector/httpconnector.rs +++ b/src/client/connector/httpconnector.rs @@ -36,35 +36,29 @@ pub struct HTTPConnector { impl HTTPConnector { pub fn new(pull_url: &str, ntfy_url: &str, ip_getter_url: &str) -> result::Result<Self, HTTPConnectorError> { - Ok( - Self { - network_enforcer: Executor::new( - NETWORK_T.as_ref(), - ["true"], - (), - ), // .unwrap() should never panic - prev: String::new(), - pull_url: Url::parse(pull_url)?, - ntfy_url: Url::parse(ntfy_url)?, - ip_getter_url: match Url::parse(ip_getter_url) { - Ok(url) => url, - Err(_) => Url::parse((pull_url.to_string() + ip_getter_url).as_str())?, - }, - client: match Client::builder().build() { + Ok(Self { + network_enforcer: Executor::new(NETWORK_T.as_ref(), ["true"], ()), // .unwrap() should never panic + prev: String::new(), + pull_url: Url::parse(pull_url)?, + ntfy_url: Url::parse(ntfy_url)?, + ip_getter_url: match Url::parse(ip_getter_url) { + Ok(url) => url, + Err(_) => Url::parse((pull_url.to_string() + ip_getter_url).as_str())?, + }, + client: match Client::builder().build() { + Ok(c) => c, + Err(_) => match Client::builder() + .danger_accept_invalid_certs(true) + .build() + { Ok(c) => c, - Err(_) => match Client::builder() + Err(_) => Client::builder() .danger_accept_invalid_certs(true) - .build() - { - Ok(c) => c, - Err(_) => Client::builder() - .danger_accept_invalid_certs(true) - .danger_accept_invalid_hostnames(true) - .build()?, - }, + .danger_accept_invalid_hostnames(true) + .build()?, }, }, - ) + }) } #[allow(clippy::only_used_in_recursion)] @@ -110,28 +104,24 @@ impl Connection for HTTPConnector { // consider StatusCode::NOT_MODIFIED fn update(&self) -> Result<Self::Ok, Self::Err> { - self.handle_response( - || { - self.client - .get( - self.pull_url - .as_str(), - ) - }, - ) + self.handle_response(|| { + self.client + .get( + self.pull_url + .as_str(), + ) + }) } fn ntfy(&self, data: String) -> std::result::Result<(), Self::Err> { - self.handle_response( - || { - self.client - .post( - self.ntfy_url - .as_str(), - ) - .body(data.to_owned()) - }, - )?; + self.handle_response(|| { + self.client + .post( + self.ntfy_url + .as_str(), + ) + .body(data.to_owned()) + })?; Ok(()) } @@ -151,25 +141,21 @@ impl Connection for HTTPConnector { } fn get_ip(&self) -> Option<IpAddr> { - match self.handle_response( - || { - self.client - .get( - self.ip_getter_url - .as_str(), - ) - }, - ) { + match self.handle_response(|| { + self.client + .get( + self.ip_getter_url + .as_str(), + ) + }) { Result::Ok(ip) => Some( ip.parse() .ok()?, ), - Result::Err(_) => match self.handle_response( - || { - self.client - .get("ifconfig.me") - }, - ) { + Result::Err(_) => match self.handle_response(|| { + self.client + .get("ifconfig.me") + }) { Ok(ip) => Some( ip.parse() .ok()?, diff --git a/src/client/main.rs b/src/client/main.rs index 699e17e..bf10455 100644 --- a/src/client/main.rs +++ b/src/client/main.rs @@ -21,47 +21,39 @@ pub(crate) mod connector; fn main() { #[cfg(not(debug_assertions))] { - _ = Signals::new( - [ - SIGHUP, - SIGINT, - SIGQUIT, - SIGTRAP, - SIGABRT, - SIGPIPE, - SIGALRM, - SIGTERM, - SIGUSR1, - SIGUSR2, - SIGCHLD, - SIGCONT, - SIGTSTP, - SIGTTIN, - SIGTTOU, - SIGURG, - SIGXCPU, - SIGXFSZ, - SIGVTALRM, - SIGPROF, - SIGWINCH, - #[cfg( - any( - target_os = "linux", - target_os = "android" - ) - )] - SIGSYS, - ], - ); // discard err + _ = Signals::new([ + SIGHUP, + SIGINT, + SIGQUIT, + SIGTRAP, + SIGABRT, + SIGPIPE, + SIGALRM, + SIGTERM, + SIGUSR1, + SIGUSR2, + SIGCHLD, + SIGCONT, + SIGTSTP, + SIGTTIN, + SIGTTOU, + SIGURG, + SIGXCPU, + SIGXFSZ, + SIGVTALRM, + SIGPROF, + SIGWINCH, + #[cfg( + any( + target_os = "linux", + target_os = "android" + ) + )] + SIGSYS, + ]); // discard err } let ip = "http://127.0.0.1:8081"; - let client = Client::new( - HTTPConnector::new( - ip, ip, "/", - ) - .unwrap(), - ) - .unwrap(); + let client = Client::new(HTTPConnector::new(ip, ip, "/").unwrap()).unwrap(); client.enter_loop(); } diff --git a/src/executor.rs b/src/executor.rs index a2a7856..21f68da 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -22,17 +22,13 @@ impl<'a, 't, N: Copy + PartialEq, T> Executor<'a, 't, N, T> { pub fn run(&mut self) -> &TaskOutput { let output = (self .task - .exec)( - &self.args, &self.ctx, - ); - self.complete_task = Some( - CompletedTask { - name: self - .task - .name, - output: Some(output), - }, - ); + .exec)(&self.args, &self.ctx); + self.complete_task = Some(CompletedTask { + name: self + .task + .name, + output: Some(output), + }); self.complete_task .as_ref() .unwrap() diff --git a/src/server/server/tcpserver.rs b/src/server/server/tcpserver.rs index f4f6968..20bf5f3 100644 --- a/src/server/server/tcpserver.rs +++ b/src/server/server/tcpserver.rs @@ -33,14 +33,12 @@ pub struct TCPServer<'a> { impl<'a> TCPServer<'a> { pub fn new(listener: TcpListener) -> Arc<Self> { - let s = Arc::new( - Self { - this: RefCell::new(Weak::new()), - listener, - task: None, - clients: RefCell::new(Vec::new()), - }, - ); + let s = Arc::new(Self { + this: RefCell::new(Weak::new()), + listener, + task: None, + clients: RefCell::new(Vec::new()), + }); *s.this .borrow_mut() = Arc::downgrade(&s); s @@ -68,16 +66,14 @@ impl<'a> Server<'a> for TCPServer<'a> { Ok((socket, addr)) => self .clients .borrow_mut() - .push( - Client::new( - self.this - .borrow() - .upgrade() - .unwrap(), - socket, - addr, - ), - ), // the unwrap shouldn't panics, self has to be alive + .push(Client::new( + self.this + .borrow() + .upgrade() + .unwrap(), + socket, + addr, + )), // the unwrap shouldn't panics, self has to be alive Err(e) => eprintln!("Failed to accept connection: {e}"), }; } @@ -117,12 +113,7 @@ impl<'a> Client<'a> { } // TODO: use framed - async fn read( - &mut self, - ) -> Option<( - Vec<u8>, - usize, - )> { + async fn read(&mut self) -> Option<(Vec<u8>, usize)> { let mut len = vec![0; std::mem::size_of::<usize>()]; // vec! only take usize if !self.handle_read( self.stream @@ -130,18 +121,13 @@ impl<'a> Client<'a> { ) { return None; } - let len = usize::from_be_bytes( - match len.try_into() { - Ok(n) => n, - Err(e) => { - eprintln!( - "Failed to convert length bytes to length usize: {:?}", - e - ); - return None; - } - }, - ); // TODO: move to a shared fn with client to ensure we use same endian + let len = usize::from_be_bytes(match len.try_into() { + Ok(n) => n, + Err(e) => { + eprintln!("Failed to convert length bytes to length usize: {:?}", e); + return None; + } + }); // TODO: move to a shared fn with client to ensure we use same endian let mut buf = vec![0; len]; let read = self .stream @@ -150,11 +136,7 @@ impl<'a> Client<'a> { if !self.handle_read(read) { return None; } - Some( - ( - buf, len, - ), - ) + Some((buf, len)) } async fn poll(&mut self) -> ! { @@ -171,10 +153,7 @@ impl<'a> Client<'a> { .read() .await { - let req: Requests = match serde::decode_from_slice( - buf.as_slice(), - bincode::config::standard(), - ) { + let req: Requests = match serde::decode_from_slice(buf.as_slice(), bincode::config::standard()) { Ok((decoded, size)) => { if size != len { eprintln!("Decoded size {size} does not match expected size {len}, decode succeeded anyways?"); @@ -182,10 +161,7 @@ impl<'a> Client<'a> { decoded } Err(e) => { - eprintln!( - "Failed to decode request from client {}: {e}", - self.addr - ); + eprintln!("Failed to decode request from client {}: {e}", self.addr); continue; } }; @@ -196,25 +172,20 @@ impl<'a> Client<'a> { // Some(Request) should be send back to client fn handle_request(&self, req: Requests) -> Option<Request> { match req { - Requests::Send((prev, (name, args))) => Some( - Request::Post( - ( - name, - { - Executor::new( - (<remote_control_rs::tasks::server::Task<'_> as core::convert::TryFrom<_>>::try_from(name).unwrap()).as_ref(), - args.split_whitespace(), - ServerCtx { - stream: &self.stream, - }, - ) - .run() - .to_owned() + Requests::Send((prev, (name, args))) => Some(Request::Post( + (name, { + Executor::new( + (<remote_control_rs::tasks::server::Task<'_> as core::convert::TryFrom<_>>::try_from(name).unwrap()).as_ref(), + args.split_whitespace(), + ServerCtx { + stream: &self.stream, }, ) - .into(), - ), - ), + .run() + .to_owned() + }) + .into(), + )), _ => { panic!() } diff --git a/src/server/tasks.rs b/src/server/tasks.rs index c30d23a..88f3767 100644 --- a/src/server/tasks.rs +++ b/src/server/tasks.rs @@ -1,25 +1,12 @@ use remote_control_rs::tasks::{CompletedTask, server::Name}; use serde::Deserialize; -pub type Task = ( - Name, - String, -); +pub type Task = (Name, String); #[derive(Deserialize)] pub enum Requests { - Send( - ( - Vec<Requests>, - Task, - ), - ), - Respond( - ( - Vec<Requests>, - CompletedTask<Task>, - ), - ), + Send((Vec<Requests>, Task)), + Respond((Vec<Requests>, CompletedTask<Task>)), } #[derive(Deserialize)] diff --git a/src/tasks.rs b/src/tasks.rs index 9475d60..64d97ad 100644 --- a/src/tasks.rs +++ b/src/tasks.rs @@ -16,18 +16,8 @@ pub struct CompletedTask<N> { pub output: Option<TaskOutput>, } -impl<N> - From<( - N, - TaskOutput, - )> for CompletedTask<N> -{ - fn from( - (name, output): ( - N, - TaskOutput, - ), - ) -> Self { +impl<N> From<(N, TaskOutput)> for CompletedTask<N> { + fn from((name, output): (N, TaskOutput)) -> Self { CompletedTask { name, output: Some(output), diff --git a/src/tasks/client.rs b/src/tasks/client.rs index baadfec..af98d61 100644 --- a/src/tasks/client.rs +++ b/src/tasks/client.rs @@ -15,35 +15,25 @@ pub enum Name { impl Display for Name { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!( - f, - "{:?}", - self - ) + write!(f, "{:?}", self) } } pub const TASKS: &[Task] = &[ - Task( - BaseTask { - name: Name::Nop, - exec: no_op, - }, - ), - Task( - BaseTask { - name: Name::Exec, - exec: exec, - }, - ), + Task(BaseTask { + name: Name::Nop, + exec: no_op, + }), + Task(BaseTask { + name: Name::Exec, + exec: exec, + }), NETWORK_T, ]; -pub const NETWORK_T: Task = Task( - BaseTask { - name: Name::Network, - exec: network, - }, -); +pub const NETWORK_T: Task = Task(BaseTask { + name: Name::Network, + exec: network, +}); fn no_op(_: &[&str], _: &()) -> Result<String, String> { Ok("".to_string()) @@ -90,56 +80,48 @@ fn network(switch: &[&str], _: &()) -> Result<String, String> { Ok(devs) => { match Command::new("awk") .arg(r#"/Wi-Fi|AirPort/{getline; print $2}"#) - .stdin( - Stdio::from( - match devs.stdout { - Some(s) => s, - None => match devs.stderr { - Some(mut e) => { - let mut reason = String::new(); - if let Err(e) = e.read_to_string(&mut reason) { - return Err(format!("networksetup failed to list hardware: {e}")); - } - return Err(format!("networksetup failed to list hardware: {reason}")); - } - None => Err("networksetup failed to list hardware".to_string())?, - }, - }, - ), - ) + .stdin(Stdio::from(match devs.stdout { + Some(s) => s, + None => match devs.stderr { + Some(mut e) => { + let mut reason = String::new(); + if let Err(e) = e.read_to_string(&mut reason) { + return Err(format!("networksetup failed to list hardware: {e}")); + } + return Err(format!("networksetup failed to list hardware: {reason}")); + } + None => Err("networksetup failed to list hardware".to_string())?, + }, + })) .stdout(Stdio::piped()) .spawn() { Ok(dev) => match Command::new("networksetup") .arg("-setairportpower") - .arg( - match dev.stdout { - Some(mut o) => { - let mut output = String::new(); - if let Err(e) = o.read_to_string(&mut output) { + .arg(match dev.stdout { + Some(mut o) => { + let mut output = String::new(); + if let Err(e) = o.read_to_string(&mut output) { + return Err(format!("awk failed to get device from networksetup list hardware: {e}")); + }; + output + } + None => match dev.stderr { + Some(mut e) => { + let mut reason = String::new(); + if let Err(e) = e.read_to_string(&mut reason) { return Err(format!("awk failed to get device from networksetup list hardware: {e}")); - }; - output - } - None => match dev.stderr { - Some(mut e) => { - let mut reason = String::new(); - if let Err(e) = e.read_to_string(&mut reason) { - return Err(format!("awk failed to get device from networksetup list hardware: {e}")); - } - return Err(format!("awk failed to get device from networksetup list hardware: {reason}")); } - None => Err("awk failed to get device from networksetup list hardware".to_string())?, - }, - }, - ) - .arg( - if switch { - "on" - } else { - "off" + return Err(format!("awk failed to get device from networksetup list hardware: {reason}")); + } + None => Err("awk failed to get device from networksetup list hardware".to_string())?, }, - ) + }) + .arg(if switch { + "on" + } else { + "off" + }) .output() { Ok(o) => { diff --git a/src/tasks/server.rs b/src/tasks/server.rs index 4271b7c..e466bdb 100644 --- a/src/tasks/server.rs +++ b/src/tasks/server.rs @@ -18,21 +18,15 @@ pub enum Name { impl Display for Name { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!( - f, - "{:?}", - self - ) + write!(f, "{:?}", self) } } pub const TASKS: &[Task] = &[ - Task( - BaseTask { - name: Name::GetIp, - exec: get_ip, - }, - ), + Task(BaseTask { + name: Name::GetIp, + exec: get_ip, + }), ]; fn get_ip(_: &[&str], ctx: &ServerCtx) -> TaskOutput { @@ -40,10 +34,9 @@ fn get_ip(_: &[&str], ctx: &ServerCtx) -> TaskOutput { .stream .peer_addr() { - Ok(addr) => Ok( - addr.ip() - .to_string(), - ), + Ok(addr) => Ok(addr + .ip() + .to_string()), Err(e) => Err(e.to_string()), } } @@ -53,14 +46,10 @@ impl<'a> TryFrom<Name> for Task<'a> { fn try_from(value: Name) -> Result<Self, Self::Error> { match value { - Name::GetIp => Ok( - Task( - BaseTask { - name: Name::GetIp, - exec: get_ip, - }, - ), - ), + Name::GetIp => Ok(Task(BaseTask { + name: Name::GetIp, + exec: get_ip, + })), } } } |
