mongo_embedded/
process.rs

1use anyhow::{anyhow, Result};
2use std::process::{Child, Command};
3use std::path::{Path, PathBuf};
4use crate::downloader::Os;
5
6pub struct MongoProcess {
7    child: Child,
8}
9
10impl MongoProcess {
11    pub fn start(
12        extracted_path: &Path,
13        port: u16,
14        db_path: &Path,
15        os: &Os,
16        bind_ip: &str,
17    ) -> Result<Self> {
18        let binary_name = match os {
19            Os::Windows => "mongod.exe",
20            _ => "mongod",
21        };
22
23        let binary_path = find_binary(extracted_path, binary_name)
24            .ok_or_else(|| anyhow!("Could not find {} in extracted directory", binary_name))?;
25
26        // Ensure binary is executable on Unix
27        #[cfg(unix)]
28        {
29            use std::os::unix::fs::PermissionsExt;
30            let mut perms = std::fs::metadata(&binary_path)?.permissions();
31            perms.set_mode(0o755);
32            std::fs::set_permissions(&binary_path, perms)?;
33        }
34
35        if !db_path.exists() {
36            std::fs::create_dir_all(db_path)?;
37        }
38
39        let child = Command::new(binary_path)
40            .arg("--port")
41            .arg(port.to_string())
42            .arg("--dbpath")
43            .arg(db_path)
44            .arg("--bind_ip")
45            .arg(bind_ip)
46            .spawn()?;
47
48        Ok(Self { child })
49    }
50
51    pub fn kill(&mut self) -> Result<()> {
52        self.child.kill()?;
53        self.child.wait()?;
54        Ok(())
55    }
56}
57
58fn find_binary(root: &Path, name: &str) -> Option<PathBuf> {
59    if root.is_file() {
60        if root.file_name()?.to_str()? == name {
61            return Some(root.to_path_buf());
62        }
63        return None;
64    }
65
66    if root.is_dir() {
67        for entry in std::fs::read_dir(root).ok()? {
68            let entry = entry.ok()?;
69            let path = entry.path();
70            if let Some(found) = find_binary(&path, name) {
71                return Some(found);
72            }
73        }
74    }
75    None
76}