Phase 0 of Python-to-Rust CLI rewrite: - Cargo.toml with all dependencies (kube-rs, reqwest, russh, rcgen, lettre, etc.) - build.rs: downloads kustomize v5.8.1 + helm v4.1.0 at compile time, embeds as bytes, sets SUNBEAM_COMMIT from git - src/main.rs: tokio main with anyhow error formatting - src/cli.rs: full clap derive struct tree matching all Python argparse subcommands - src/config.rs: SunbeamConfig serde struct, load/save ~/.sunbeam.json - src/output.rs: step/ok/warn/table with exact Python format strings - src/tools.rs: embedded kustomize+helm extraction to cache dir - src/kube.rs: parse_target, domain_replace, context management - src/manifests.rs: filter_by_namespace with full test coverage - Stub modules for all remaining features (cluster, secrets, images, services, checks, gitea, users, update) 23 tests pass, cargo check clean.
52 lines
1.5 KiB
Rust
52 lines
1.5 KiB
Rust
use anyhow::{Context, Result};
|
|
use std::path::PathBuf;
|
|
|
|
static KUSTOMIZE_BIN: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/kustomize"));
|
|
static HELM_BIN: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/helm"));
|
|
|
|
fn cache_dir() -> PathBuf {
|
|
dirs::data_dir()
|
|
.unwrap_or_else(|| dirs::home_dir().unwrap_or_else(|| PathBuf::from(".")))
|
|
.join("sunbeam")
|
|
.join("bin")
|
|
}
|
|
|
|
/// Extract an embedded binary to the cache directory if not already present.
|
|
fn extract_embedded(data: &[u8], name: &str) -> Result<PathBuf> {
|
|
let dir = cache_dir();
|
|
std::fs::create_dir_all(&dir)
|
|
.with_context(|| format!("Failed to create cache dir: {}", dir.display()))?;
|
|
|
|
let dest = dir.join(name);
|
|
|
|
// Skip if already extracted and same size
|
|
if dest.exists() {
|
|
if let Ok(meta) = std::fs::metadata(&dest) {
|
|
if meta.len() == data.len() as u64 {
|
|
return Ok(dest);
|
|
}
|
|
}
|
|
}
|
|
|
|
std::fs::write(&dest, data)
|
|
.with_context(|| format!("Failed to write {}", dest.display()))?;
|
|
|
|
#[cfg(unix)]
|
|
{
|
|
use std::os::unix::fs::PermissionsExt;
|
|
std::fs::set_permissions(&dest, std::fs::Permissions::from_mode(0o755))?;
|
|
}
|
|
|
|
Ok(dest)
|
|
}
|
|
|
|
/// Ensure kustomize is extracted and return its path.
|
|
pub fn ensure_kustomize() -> Result<PathBuf> {
|
|
extract_embedded(KUSTOMIZE_BIN, "kustomize")
|
|
}
|
|
|
|
/// Ensure helm is extracted and return its path.
|
|
pub fn ensure_helm() -> Result<PathBuf> {
|
|
extract_embedded(HELM_BIN, "helm")
|
|
}
|