/ src / main.rs
main.rs
 1  use build_build::{
 2      root::Root,
 3      sandbox::{isolation::IsolationPath, SandboxCommand},
 4  };
 5  use std::{fs, io, time::SystemTime};
 6  
 7  fn inner_main() -> io::Result<()> {
 8      let root = Root::discover();
 9      root.enter();
10  
11      let time = SystemTime::now();
12      let tmp_dir = root.tmp_dir("sandbox-exec", &time);
13  
14      log::debug!("TMPDIR is {}", tmp_dir.display());
15  
16      let cmd = SandboxCommand::new("/bin/bash")
17          .args([
18              "-c",
19              "set -e; printenv > $TMPDIR/env.txt; find $TMPDIR > $TMPDIR/find.txt; echo $TMPDIR",
20          ])
21          .env("ABC", "DEF")
22          .env("TMPDIR", tmp_dir.as_path())
23          .pipe_stdout("stdout")
24          .pipe_stderr("stderr")
25          .allow_read_path(IsolationPath::dir("/"))
26          .deny_path(IsolationPath::dir(root.path()))
27          .allow_path(IsolationPath::dir(tmp_dir.as_path()));
28  
29      let out = cmd.run(&root)?;
30      log::debug!("status: {out:?}");
31  
32      if !out.status.success() {
33          tmp_dir.keep();
34      }
35  
36      let stdout = fs::read(&out.stdout)?;
37      for line in std::str::from_utf8(stdout.as_slice()).unwrap().lines() {
38          log::trace!("stdout: {line}");
39      }
40  
41      let stderr = fs::read(&out.stderr)?;
42      for line in std::str::from_utf8(stderr.as_slice()).unwrap().lines() {
43          log::trace!("stderr: {line}");
44      }
45  
46      Ok(())
47  }
48  
49  fn main() {
50      simple_logger::init_with_level(log::Level::Trace).unwrap();
51      inner_main().unwrap_or_else(|err| {
52          println!("{err}");
53      })
54  }