ceph_safe_disk/
exec.rs

1use crate::error::CSDError;
2use users::get_current_username;
3
4use std::process::Command;
5
6pub fn call_ceph(cmd: &str) -> Result<String, CSDError> {
7    debug!("calling ceph {} -f json", cmd);
8    let ceph = Command::new("/usr/bin/env")
9        .args(&["sh", "-c", &format!("ceph {} -f json", cmd)])
10        .output()?;
11    if ceph.status.success() {
12        let stdout = String::from_utf8(ceph.stdout)?;
13        trace!("ceph_cmd stdout: {}", stdout.trim_start());
14        Ok(stdout.trim_start().to_string())
15    } else {
16        let stderr = String::from_utf8(ceph.stderr)?;
17        Err(CSDError::CephExecError(stderr))
18    }
19}
20
21// Check which user this is being run as
22pub fn check_user() -> Result<(), CSDError> {
23    match get_current_username() {
24        Some(user) => {
25            let user = user.to_string_lossy();
26            match user.as_ref() {
27                "ceph" => Ok(()),
28                "root" => Ok(()),
29                _ => Err(CSDError::ExecError),
30            }
31        }
32        None => Err(CSDError::ExecError),
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    #[should_panic]
42    fn check_user_panic() {
43        assert!(check_user().is_ok());
44    }
45}