autopulse_service/settings/targets/
autopulse.rs

1use 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;
8use tracing::{debug, error};
9
10#[derive(Clone, Deserialize)]
11pub struct Autopulse {
12    /// URL to the autopulse instance
13    pub url: String,
14    /// Authentication credentials
15    pub auth: Auth,
16    /// Trigger to hit (must be type: manual) (default: manual)
17    pub trigger: Option<String>,
18    /// Rewrite path for the file
19    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        println!("headers: {headers:?}");
31
32        reqwest::Client::builder()
33            .timeout(std::time::Duration::from_secs(10))
34            .default_headers(headers)
35            .build()
36            .map_err(Into::into)
37    }
38
39    async fn scan(&self, ev: &ScanEvent) -> anyhow::Result<()> {
40        let client = self.get_client()?;
41        let mut url = get_url(&self.url)?.join("triggers/manual")?;
42
43        url.query_pairs_mut()
44            .append_pair("path", &ev.get_path(&self.rewrite));
45
46        if ev.file_hash.is_some() {
47            url.query_pairs_mut()
48                .append_pair("hash", ev.file_hash.as_ref().unwrap());
49        }
50
51        client.get(url).perform().await.map(|_| ())
52    }
53}
54
55impl TargetProcess for Autopulse {
56    async fn process(&self, evs: &[&ScanEvent]) -> anyhow::Result<Vec<String>> {
57        let mut succeeded = Vec::new();
58
59        for ev in evs {
60            match self.scan(ev).await {
61                Ok(()) => {
62                    succeeded.push(ev.id.clone());
63                    debug!("file scanned: {}", ev.get_path(&self.rewrite));
64                }
65                Err(e) => {
66                    error!("error scanning file: {}", e);
67                }
68            }
69        }
70
71        Ok(succeeded)
72    }
73}