use std::path::Path;
pub const ESSENTIAL_VARS: &[&str] = &[
"PATH", "HOME", "USER", "SHELL", "TERM", "LANG", "LC_ALL", "TMPDIR", "TZ",
];
pub(crate) fn run_child(
program: &str,
args: &[String],
proxy_url: &str,
env_vars_with_masked: &[(String, String)],
ssl_cert_file: &Path,
) -> Result<std::process::ExitStatus, Box<dyn std::error::Error + Send + Sync>> {
let mut command = std::process::Command::new(program);
command.args(args);
command.env_clear();
for &var in ESSENTIAL_VARS {
if let Ok(val) = std::env::var(var) {
command.env(var, val);
}
}
command.env("HTTP_PROXY", proxy_url);
command.env("HTTPS_PROXY", proxy_url);
command.env("NO_PROXY", "");
let ssl_path = ssl_cert_file.to_string_lossy();
command.env("SSL_CERT_FILE", ssl_path.as_ref());
command.env("NODE_EXTRA_CA_CERTS", ssl_path.as_ref());
command.env("REQUESTS_CA_BUNDLE", ssl_path.as_ref());
for (k, v) in env_vars_with_masked {
command.env(k, v);
}
let status = command
.status()
.map_err(|e| -> Box<dyn std::error::Error + Send + Sync> { e.into() })?;
Ok(status)
}