mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-03-07 20:09:59 +03:00
enter hook command (#130)
new configuration option `enter_hook` can now be used to spawn a command when a client is entered
This commit is contained in:
committed by
GitHub
parent
e9738fc024
commit
799b45104a
@@ -22,7 +22,7 @@ anyhow = "1.0.71"
|
|||||||
log = "0.4.20"
|
log = "0.4.20"
|
||||||
env_logger = "0.11.3"
|
env_logger = "0.11.3"
|
||||||
serde_json = "1.0.107"
|
serde_json = "1.0.107"
|
||||||
tokio = {version = "1.32.0", features = ["io-util", "io-std", "macros", "net", "rt", "sync", "signal"] }
|
tokio = {version = "1.32.0", features = ["io-util", "io-std", "macros", "net", "process", "rt", "sync", "signal"] }
|
||||||
async-trait = "0.1.73"
|
async-trait = "0.1.73"
|
||||||
futures-core = "0.3.28"
|
futures-core = "0.3.28"
|
||||||
futures = "0.3.28"
|
futures = "0.3.28"
|
||||||
|
|||||||
@@ -102,6 +102,8 @@ pub struct ClientConfig {
|
|||||||
pub port: u16,
|
pub port: u16,
|
||||||
/// position of a client on screen
|
/// position of a client on screen
|
||||||
pub pos: Position,
|
pub pos: Position,
|
||||||
|
/// enter hook
|
||||||
|
pub cmd: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for ClientConfig {
|
impl Default for ClientConfig {
|
||||||
@@ -111,6 +113,7 @@ impl Default for ClientConfig {
|
|||||||
hostname: Default::default(),
|
hostname: Default::default(),
|
||||||
fix_ips: Default::default(),
|
fix_ips: Default::default(),
|
||||||
pos: Default::default(),
|
pos: Default::default(),
|
||||||
|
cmd: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ pub struct TomlClient {
|
|||||||
pub ips: Option<Vec<IpAddr>>,
|
pub ips: Option<Vec<IpAddr>>,
|
||||||
pub port: Option<u16>,
|
pub port: Option<u16>,
|
||||||
pub activate_on_startup: Option<bool>,
|
pub activate_on_startup: Option<bool>,
|
||||||
|
pub enter_hook: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ConfigToml {
|
impl ConfigToml {
|
||||||
@@ -92,6 +93,7 @@ pub struct ConfigClient {
|
|||||||
pub port: u16,
|
pub port: u16,
|
||||||
pub pos: Position,
|
pub pos: Position,
|
||||||
pub active: bool,
|
pub active: bool,
|
||||||
|
pub enter_hook: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
const DEFAULT_RELEASE_KEYS: [scancode::Linux; 4] =
|
const DEFAULT_RELEASE_KEYS: [scancode::Linux; 4] =
|
||||||
@@ -208,12 +210,14 @@ impl Config {
|
|||||||
None => c.host_name.clone(),
|
None => c.host_name.clone(),
|
||||||
};
|
};
|
||||||
let active = c.activate_on_startup.unwrap_or(false);
|
let active = c.activate_on_startup.unwrap_or(false);
|
||||||
|
let enter_hook = c.enter_hook.clone();
|
||||||
ConfigClient {
|
ConfigClient {
|
||||||
ips,
|
ips,
|
||||||
hostname,
|
hostname,
|
||||||
port,
|
port,
|
||||||
pos: *pos,
|
pos: *pos,
|
||||||
active,
|
active,
|
||||||
|
enter_hook,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ impl Server {
|
|||||||
fix_ips: config_client.ips.into_iter().collect(),
|
fix_ips: config_client.ips.into_iter().collect(),
|
||||||
port: config_client.port,
|
port: config_client.port,
|
||||||
pos: config_client.pos,
|
pos: config_client.pos,
|
||||||
|
cmd: config_client.enter_hook,
|
||||||
};
|
};
|
||||||
let state = ClientState {
|
let state = ClientState {
|
||||||
active: config_client.active,
|
active: config_client.active,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use anyhow::{anyhow, Result};
|
|||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
use std::{collections::HashSet, net::SocketAddr};
|
use std::{collections::HashSet, net::SocketAddr};
|
||||||
|
|
||||||
use tokio::{sync::mpsc::Sender, task::JoinHandle};
|
use tokio::{process::Command, sync::mpsc::Sender, task::JoinHandle};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
capture::{self, InputCapture},
|
capture::{self, InputCapture},
|
||||||
@@ -140,6 +140,9 @@ async fn handle_capture_event(
|
|||||||
if start_timer {
|
if start_timer {
|
||||||
let _ = timer_tx.try_send(());
|
let _ = timer_tx.try_send(());
|
||||||
}
|
}
|
||||||
|
if enter {
|
||||||
|
spawn_hook_command(server, handle);
|
||||||
|
}
|
||||||
if let Some(addr) = addr {
|
if let Some(addr) = addr {
|
||||||
if enter {
|
if enter {
|
||||||
let _ = sender_tx.send((Event::Enter(), addr)).await;
|
let _ = sender_tx.send((Event::Enter(), addr)).await;
|
||||||
@@ -148,3 +151,34 @@ async fn handle_capture_event(
|
|||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn spawn_hook_command(server: &Server, handle: ClientHandle) {
|
||||||
|
let Some(cmd) = server
|
||||||
|
.client_manager
|
||||||
|
.borrow()
|
||||||
|
.get(handle)
|
||||||
|
.and_then(|(c, _)| c.cmd.clone())
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
tokio::task::spawn_local(async move {
|
||||||
|
log::info!("spawning command!");
|
||||||
|
let mut child = match Command::new("sh").arg("-c").arg(cmd.as_str()).spawn() {
|
||||||
|
Ok(c) => c,
|
||||||
|
Err(e) => {
|
||||||
|
log::warn!("could not execute cmd: {e}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
match child.wait().await {
|
||||||
|
Ok(s) => {
|
||||||
|
if s.success() {
|
||||||
|
log::info!("{cmd} exited successfully");
|
||||||
|
} else {
|
||||||
|
log::warn!("{cmd} exited with {s}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(e) => log::warn!("{cmd}: {e}"),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user