mongo_embedded/
process.rs1use 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 #[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}