Broadcast work requests to each node
This commit is contained in:
@ -3,6 +3,7 @@ use chrono::{NaiveDateTime, Utc};
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate rocket;
|
extern crate rocket;
|
||||||
|
|
||||||
|
use cidr::IpCidr;
|
||||||
use event_bus::{EventBusSubscriber, EventBusWriter};
|
use event_bus::{EventBusSubscriber, EventBusWriter};
|
||||||
use rocket::{fairing::AdHoc, futures::SinkExt, trace::error, Rocket, State};
|
use rocket::{fairing::AdHoc, futures::SinkExt, trace::error, Rocket, State};
|
||||||
use rocket_db_pools::{
|
use rocket_db_pools::{
|
||||||
@ -18,6 +19,8 @@ use rocket_db_pools::{
|
|||||||
Connection,
|
Connection,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::worker::modules::{Network, WorkerMessages};
|
||||||
|
|
||||||
use rocket_db_pools::diesel::mysql::{Mysql, MysqlValue};
|
use rocket_db_pools::diesel::mysql::{Mysql, MysqlValue};
|
||||||
use rocket_db_pools::diesel::serialize::IsNull;
|
use rocket_db_pools::diesel::serialize::IsNull;
|
||||||
use rocket_db_pools::diesel::sql_types::Text;
|
use rocket_db_pools::diesel::sql_types::Text;
|
||||||
@ -29,9 +32,9 @@ use rocket_ws::WebSocket;
|
|||||||
use server::Server;
|
use server::Server;
|
||||||
use worker::detection::{detect_scanner, get_dns_client, Scanners};
|
use worker::detection::{detect_scanner, get_dns_client, Scanners};
|
||||||
|
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::{env, fmt};
|
use std::{env, fmt};
|
||||||
use std::{io::Write, net::SocketAddr};
|
use std::{io::Write, net::SocketAddr};
|
||||||
|
use std::{path::PathBuf, str::FromStr};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use serde::{Deserialize, Deserializer, Serialize};
|
use serde::{Deserialize, Deserializer, Serialize};
|
||||||
@ -220,17 +223,21 @@ enum MultiReply {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[post("/scan", data = "<form>")]
|
#[post("/scan", data = "<form>")]
|
||||||
async fn handle_scan(mut db: DbConn, form: Form<ScanParams<'_>>) -> MultiReply {
|
async fn handle_scan(
|
||||||
|
mut db: DbConn,
|
||||||
|
form: Form<ScanParams<'_>>,
|
||||||
|
event_bus_writer: &State<EventBusWriter>,
|
||||||
|
) -> MultiReply {
|
||||||
if form.username.len() < 4 {
|
if form.username.len() < 4 {
|
||||||
return MultiReply::FormError(PlainText("Invalid username".to_string()));
|
return MultiReply::FormError(PlainText("Invalid username".to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
let task_group_id: Uuid = Uuid::now_v7();
|
let task_group_id: Uuid = Uuid::now_v7();
|
||||||
|
|
||||||
for ip in form.ips.lines() {
|
for cidr in form.ips.lines() {
|
||||||
let scan_task = ScanTask {
|
let scan_task = ScanTask {
|
||||||
task_group_id: task_group_id.to_string(),
|
task_group_id: task_group_id.to_string(),
|
||||||
cidr: ip.to_string(),
|
cidr: cidr.to_string(),
|
||||||
created_by_username: form.username.to_string(),
|
created_by_username: form.username.to_string(),
|
||||||
created_at: Utc::now().naive_utc(),
|
created_at: Utc::now().naive_utc(),
|
||||||
updated_at: None,
|
updated_at: None,
|
||||||
@ -238,8 +245,19 @@ async fn handle_scan(mut db: DbConn, form: Form<ScanParams<'_>>) -> MultiReply {
|
|||||||
still_processing_at: None,
|
still_processing_at: None,
|
||||||
ended_at: None,
|
ended_at: None,
|
||||||
};
|
};
|
||||||
|
let mut bus_tx = event_bus_writer.write();
|
||||||
match scan_task.save(&mut db).await {
|
match scan_task.save(&mut db).await {
|
||||||
Ok(_) => error!("Added {}", ip.to_string()),
|
Ok(_) => {
|
||||||
|
info!("Added {}", cidr.to_string());
|
||||||
|
let net = IpCidr::from_str(cidr).unwrap();
|
||||||
|
|
||||||
|
let msg = WorkerMessages::DoWorkRequest {
|
||||||
|
neworks: vec![Network(net)],
|
||||||
|
}
|
||||||
|
.into();
|
||||||
|
|
||||||
|
let _ = bus_tx.send(msg).await;
|
||||||
|
}
|
||||||
Err(err) => error!("Not added: {:?}", err),
|
Err(err) => error!("Not added: {:?}", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -460,11 +478,7 @@ async fn index() -> HtmlContents {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[get("/ping")]
|
#[get("/ping")]
|
||||||
async fn pong(event_bus_writer: &State<EventBusWriter>) -> PlainText {
|
async fn pong() -> PlainText {
|
||||||
let mut bus_tx = event_bus_writer.write();
|
|
||||||
let _ = bus_tx
|
|
||||||
.send(rocket_ws::Message::Text("Groumpf!".to_string()))
|
|
||||||
.await;
|
|
||||||
PlainText("pong".to_string())
|
PlainText("pong".to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
use cidr::IpCidr;
|
|
||||||
use rocket::futures::{stream::Next, SinkExt, StreamExt};
|
use rocket::futures::{stream::Next, SinkExt, StreamExt};
|
||||||
use rocket_ws::{frame::CloseFrame, Message};
|
use rocket_ws::{frame::CloseFrame, Message};
|
||||||
use std::{pin::Pin, str::FromStr};
|
use std::pin::Pin;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
event_bus::{EventBusEvent, EventBusWriter},
|
event_bus::{EventBusEvent, EventBusWriter},
|
||||||
worker::modules::{Network, WorkerMessages},
|
worker::modules::WorkerMessages,
|
||||||
};
|
};
|
||||||
use rocket::futures::channel::mpsc as rocket_mpsc;
|
use rocket::futures::channel::mpsc as rocket_mpsc;
|
||||||
|
|
||||||
@ -21,10 +20,8 @@ impl WsChat {
|
|||||||
use crate::rocket::futures::StreamExt;
|
use crate::rocket::futures::StreamExt;
|
||||||
use rocket::tokio;
|
use rocket::tokio;
|
||||||
|
|
||||||
let _ = bus_tx
|
let _ = bus_tx.send(rocket_ws::Message::Ping(vec![])).await;
|
||||||
.send(rocket_ws::Message::Text("I am new !".to_string()))
|
|
||||||
.await;
|
|
||||||
//SharedData::send_to_all(&workers, "I am new !");
|
|
||||||
let mut worker = Worker::initial(&mut stream);
|
let mut worker = Worker::initial(&mut stream);
|
||||||
let mut interval = rocket::tokio::time::interval(std::time::Duration::from_secs(60));
|
let mut interval = rocket::tokio::time::interval(std::time::Duration::from_secs(60));
|
||||||
loop {
|
loop {
|
||||||
@ -279,10 +276,7 @@ impl<'a> Worker<'a> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
WorkerMessages::GetWorkRequest {} => {
|
WorkerMessages::GetWorkRequest {} => {
|
||||||
let net = IpCidr::from_str("52.189.78.0/24").unwrap();
|
worker_reply = Some(WorkerMessages::DoWorkRequest { neworks: vec![] });
|
||||||
worker_reply = Some(WorkerMessages::DoWorkRequest {
|
|
||||||
neworks: vec![Network(net)],
|
|
||||||
});
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
WorkerMessages::DoWorkRequest { .. } | WorkerMessages::Invalid { .. } => {
|
WorkerMessages::DoWorkRequest { .. } | WorkerMessages::Invalid { .. } => {
|
||||||
|
@ -67,6 +67,12 @@ impl Into<WorkerMessages> for String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Into<RocketMessage> for WorkerMessages {
|
||||||
|
fn into(self) -> RocketMessage {
|
||||||
|
RocketMessage::Text(self.to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl TryInto<WorkerMessages> for RocketMessage {
|
impl TryInto<WorkerMessages> for RocketMessage {
|
||||||
type Error = String;
|
type Error = String;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user