autopulse_service/settings/targets/
autopulse.rs1use super::RequestBuilderPerform;
2use crate::settings::rewrite::Rewrite;
3use crate::settings::{auth::Auth, targets::TargetProcess};
4use autopulse_database::models::ScanEvent;
5use autopulse_utils::get_url;
6use reqwest::header;
7use serde::{Deserialize, Serialize};
8use tracing::{debug, error};
9
10#[derive(Serialize, Clone, Deserialize)]
11pub struct Autopulse {
12 pub url: String,
14 pub auth: Auth,
16 pub trigger: Option<String>,
18 pub rewrite: Option<Rewrite>,
20}
21
22impl Autopulse {
23 fn get_client(&self) -> anyhow::Result<reqwest::Client> {
24 let mut headers = header::HeaderMap::new();
25
26 if self.auth.enabled {
27 headers.insert("Authorization", self.auth.to_auth_encoded().parse()?);
28 }
29
30 reqwest::Client::builder()
31 .timeout(std::time::Duration::from_secs(10))
32 .default_headers(headers)
33 .build()
34 .map_err(Into::into)
35 }
36
37 async fn scan(&self, ev: &ScanEvent) -> anyhow::Result<()> {
38 let client = self.get_client()?;
39 let mut url = get_url(&self.url)?.join("triggers/manual")?;
40
41 url.query_pairs_mut()
42 .append_pair("path", &ev.get_path(&self.rewrite));
43
44 if ev.file_hash.is_some() {
45 url.query_pairs_mut()
46 .append_pair("hash", ev.file_hash.as_ref().unwrap());
47 }
48
49 client.get(url).perform().await.map(|_| ())
50 }
51}
52
53impl TargetProcess for Autopulse {
54 async fn process(&self, evs: &[&ScanEvent]) -> anyhow::Result<Vec<String>> {
55 let mut succeeded = Vec::new();
56
57 for ev in evs {
58 match self.scan(ev).await {
59 Ok(()) => {
60 succeeded.push(ev.id.clone());
61 debug!("file scanned: {}", ev.get_path(&self.rewrite));
62 }
63 Err(e) => {
64 error!("error scanning file: {}", e);
65 }
66 }
67 }
68
69 Ok(succeeded)
70 }
71}