summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client.rs5
-rw-r--r--src/client/connector.rs23
-rw-r--r--src/client/connector/httpconnector.rs104
-rw-r--r--src/client/main.rs70
-rw-r--r--src/executor.rs18
-rw-r--r--src/server/server/tcpserver.rs103
-rw-r--r--src/server/tasks.rs19
-rw-r--r--src/tasks.rs14
-rw-r--r--src/tasks/client.rs112
-rw-r--r--src/tasks/server.rs35
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,
+ })),
}
}
}