mod command_runner;
mod composition;
#[allow(dead_code)]
mod destruction_evidence;
mod event_signing;
#[allow(dead_code)]
mod dns_proxy;
mod ebpf_flow;
#[allow(dead_code)]
mod linux_cgroup;
mod linux_isolation;
#[cfg(target_os = "linux")]
mod linux_mount;
#[cfg(target_os = "linux")]
mod linux_net;
#[cfg(target_os = "linux")]
mod linux_seccomp;
mod network_policy;
mod nft_counters;
mod per_flow;
mod proxy_activation;
#[allow(dead_code)]
mod resolver_refresh;
mod runtime_secret;
#[allow(dead_code)]
mod sni_proxy;
mod spec_input;
mod supervisor;
mod supervisor_helpers;
mod trust_keyset_load;
mod trust_plane_observability;
use std::ffi::OsString;
use std::path::PathBuf;
use anyhow::Context;
use cellos_core::{
enforce_derivation_scope_policy, validate_execution_cell_document, verify_authority_derivation,
ExecutionCellDocument,
};
use composition::{
build_supervisor, emit_startup_banner, enforce_authority_derivation_requirement,
enforce_deployment_profile, enforce_isolation_default, enforce_kubernetes_namespace_placement,
enforce_telemetry_declared, load_authority_keys, resolve_deployment_mode,
};
use spec_input::{read_cell_spec, spec_sha256};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::Layer;
let fmt_layer = tracing_subscriber::fmt::layer()
.with_writer(std::io::stderr)
.with_filter(cellos_core::observability::redacted_filter());
tracing_subscriber::registry()
.with(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
)
.with(fmt_layer)
.init();
enforce_deployment_profile()?;
let deployment_mode = resolve_deployment_mode()?;
enforce_isolation_default(deployment_mode)?;
emit_startup_banner(deployment_mode);
let args: Vec<OsString> = std::env::args_os().skip(1).collect();
if let Some(subcommand) = args.first().and_then(|s| s.to_str()) {
match subcommand {
"secret" => return runtime_secret::cli_main(&args[1..]).await,
"--version" | "-V" => {
println!("cellos-supervisor {}", env!("CARGO_PKG_VERSION"));
return Ok(());
}
_ => {}
}
}
let validate_only = args
.first()
.and_then(|s| s.to_str())
.map(|s| s == "--validate")
.unwrap_or(false);
let spec_arg_index = if validate_only { 1 } else { 0 };
let spec_path = args
.get(spec_arg_index)
.map(PathBuf::from)
.unwrap_or_else(|| PathBuf::from("contracts/examples/execution-cell-minimal.valid.json"));
let raw = read_cell_spec(&spec_path)?;
let raw_spec_hash = spec_sha256(&raw);
let doc: ExecutionCellDocument =
serde_json::from_str(&raw).context("parse ExecutionCellDocument")?;
validate_execution_cell_document(&doc).map_err(|e| anyhow::anyhow!("{e}"))?;
enforce_authority_derivation_requirement(&doc)?;
enforce_telemetry_declared(&doc)?;
enforce_kubernetes_namespace_placement(&doc)?;
if validate_only {
let validate_run_id = std::env::var("CELLOS_RUN_ID").unwrap_or_else(|_| "validate".into());
let summary = composition::build_validation_summary(
&doc,
&validate_run_id,
&raw_spec_hash,
&spec_path,
);
println!(
"{}",
serde_json::to_string_pretty(&summary).unwrap_or_default()
);
return Ok(());
}
let authority_keys = load_authority_keys()?;
let allow_universal = scoped_tokens_permissive_mode_enabled();
let mut universal_token_accepted_in_permissive_mode = false;
if let Some(token) = doc.spec.authority.authority_derivation.as_ref() {
verify_authority_derivation(&doc.spec, token, &authority_keys)
.map_err(|e| anyhow::anyhow!("{e}"))?;
enforce_derivation_scope_policy(token, allow_universal)
.map_err(|e| anyhow::anyhow!("{e}"))?;
if allow_universal && token.parent_run_id.is_none() {
universal_token_accepted_in_permissive_mode = true;
}
}
let authority_keys = std::sync::Arc::new(authority_keys);
let run_id = std::env::var("CELLOS_RUN_ID").unwrap_or_else(|_| "run-local-001".into());
let mut supervisor = build_supervisor(&doc, &run_id, authority_keys).await?;
supervisor.universal_token_accepted_in_permissive_mode =
universal_token_accepted_in_permissive_mode;
supervisor.run(&doc, &run_id, Some(&raw_spec_hash)).await
}
fn scoped_tokens_permissive_mode_enabled() -> bool {
match std::env::var("CELLOS_REQUIRE_SCOPED_DERIVATION_TOKENS") {
Ok(raw) => {
let t = raw.trim().to_ascii_lowercase();
matches!(t.as_str(), "0" | "false" | "no" | "off")
}
Err(_) => false, }
}