101 lines
2.7 KiB
Rust
101 lines
2.7 KiB
Rust
pub mod inc;
|
|
|
|
use crate::config::*;
|
|
use crate::firewall;
|
|
use crate::ip::*;
|
|
use crate::utils::*;
|
|
use crate::zmqcom::*;
|
|
|
|
use chrono::prelude::{DateTime, Local};
|
|
use nix::sys::inotify::InotifyEvent;
|
|
use std::sync::Arc;
|
|
use tokio::sync::mpsc::Sender;
|
|
use tokio::sync::Mutex;
|
|
|
|
pub struct FileEvent {
|
|
pub inevent: InotifyEvent,
|
|
pub date: DateTime<Local>,
|
|
}
|
|
|
|
impl std::fmt::Debug for FileEvent {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
write!(f, "{ie:?}", ie = self.inevent)
|
|
}
|
|
}
|
|
|
|
async fn send_to_ipbl_zmq(reqsocket: &zmq::Socket, ip: &mut IpData) {
|
|
let msg = format!("{value}", value = serde_json::to_string(&ip).unwrap());
|
|
match reqsocket.send(&msg, 0) {
|
|
Ok(_) => {}
|
|
Err(e) => {
|
|
println!("{e:?}")
|
|
}
|
|
};
|
|
match reqsocket.recv_string(0) {
|
|
Ok(o) => match o {
|
|
Ok(_) => {}
|
|
Err(ee) => {
|
|
println!("{ee:?}")
|
|
}
|
|
},
|
|
Err(e) => {
|
|
println!("{e:?}")
|
|
}
|
|
};
|
|
}
|
|
|
|
async fn send_to_ipbl_ws(ctx: &Context, ip: &mut IpData, ret: &mut Vec<String>) {
|
|
ret.push(format!("host: {hostname}", hostname = ctx.hostname));
|
|
loop {
|
|
match push_ip(&ctx, &ip, ret).await {
|
|
Ok(_) => {
|
|
break;
|
|
}
|
|
Err(err) => {
|
|
println!("{err}");
|
|
sleep(1);
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
async fn listenpubsub(ctx: &Arc<Mutex<Context>>, txpubsub: Sender<IpData>, socket: zmq::Socket) {
|
|
let ctx = ctx.lock().await;
|
|
let prefix = format!(
|
|
"{sub} ",
|
|
sub = ctx.cfg.zmq.get("pubsub").unwrap().subscription
|
|
);
|
|
socket
|
|
.set_subscribe(ctx.cfg.zmq.get("pubsub").unwrap().subscription.as_bytes())
|
|
.expect("failed setting subscription");
|
|
drop(ctx);
|
|
|
|
tokio::spawn(async move {
|
|
loop {
|
|
let msgs: Option<String> = match socket.recv_string(0) {
|
|
Ok(s) => match s {
|
|
Ok(ss) => Some(ss),
|
|
Err(e) => {
|
|
println!("{e:?}");
|
|
None
|
|
}
|
|
},
|
|
Err(e) => {
|
|
println!("{e:?}");
|
|
None
|
|
}
|
|
};
|
|
match msgs {
|
|
Some(ss) => {
|
|
let msg = ss.strip_prefix(prefix.as_str()).unwrap();
|
|
let tosend: IpData = serde_json::from_str(msg).unwrap();
|
|
if tosend.hostname != gethostname(true) || tosend.mode == "init".to_string() {
|
|
txpubsub.send(tosend).await.unwrap();
|
|
}
|
|
}
|
|
None => {}
|
|
};
|
|
}
|
|
});
|
|
}
|