#![forbid(unsafe_code)]
#![warn(missing_docs)]
use std::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct RuntimeCapability {
name: &'static str,
supported: bool,
reason: Option<&'static str>,
}
impl RuntimeCapability {
#[must_use]
pub const fn supported(name: &'static str, reason: Option<&'static str>) -> Self {
Self {
name,
supported: true,
reason,
}
}
#[must_use]
pub const fn unsupported(name: &'static str, reason: &'static str) -> Self {
Self {
name,
supported: false,
reason: Some(reason),
}
}
#[must_use]
pub const fn name(self) -> &'static str {
self.name
}
#[must_use]
pub const fn is_supported(self) -> bool {
self.supported
}
#[must_use]
pub const fn reason(self) -> Option<&'static str> {
self.reason
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct UnsupportedRuntimeCapability {
name: &'static str,
reason: &'static str,
}
impl UnsupportedRuntimeCapability {
#[must_use]
pub const fn new(name: &'static str, reason: &'static str) -> Self {
Self { name, reason }
}
#[must_use]
pub const fn name(&self) -> &'static str {
self.name
}
#[must_use]
pub const fn reason(&self) -> &'static str {
self.reason
}
}
impl fmt::Display for UnsupportedRuntimeCapability {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"runtime capability `{}` is not supported: {}",
self.name, self.reason
)
}
}
impl std::error::Error for UnsupportedRuntimeCapability {}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct RuntimeCapabilities {
backend: &'static str,
supported: &'static [RuntimeCapability],
unsupported: &'static [RuntimeCapability],
}
impl RuntimeCapabilities {
#[must_use]
pub const fn new(
backend: &'static str,
supported: &'static [RuntimeCapability],
unsupported: &'static [RuntimeCapability],
) -> Self {
Self {
backend,
supported,
unsupported,
}
}
#[must_use]
pub const fn backend(self) -> &'static str {
self.backend
}
#[must_use]
pub const fn supported(self) -> &'static [RuntimeCapability] {
self.supported
}
#[must_use]
pub const fn unsupported(self) -> &'static [RuntimeCapability] {
self.unsupported
}
#[must_use]
pub fn supports(self, name: &str) -> bool {
self.supported
.iter()
.any(|capability| capability.name == name)
}
pub fn require_supported(self, name: &'static str) -> Result<(), UnsupportedRuntimeCapability> {
if self.supports(name) {
return Ok(());
}
let reason = self
.unsupported
.iter()
.find(|capability| capability.name == name)
.and_then(|capability| capability.reason)
.unwrap_or("capability is not advertised by this backend");
Err(UnsupportedRuntimeCapability::new(name, reason))
}
}
pub const APPLE_LOCAL_RUNTIME_SUPPORTED_CAPABILITIES: &[RuntimeCapability] = &[
RuntimeCapability::supported("create-linux-container", None),
RuntimeCapability::supported("delete-linux-container", None),
RuntimeCapability::supported("exec-process", None),
RuntimeCapability::supported("copy-in", None),
RuntimeCapability::supported("copy-out", None),
RuntimeCapability::supported("pod-vm", None),
RuntimeCapability::supported("pod-emptydir", None),
RuntimeCapability::supported("pod-guest-path-rootfs", None),
RuntimeCapability::supported("basic-container-metrics", None),
RuntimeCapability::supported(
"vmnet-network-attach",
Some("Available on macOS 26 and newer"),
),
RuntimeCapability::supported(
"rosetta-linux-amd64",
Some("Requires Rosetta preflight success"),
),
];
pub const APPLE_LOCAL_RUNTIME_UNSUPPORTED_CAPABILITIES: &[RuntimeCapability] = &[
RuntimeCapability::unsupported(
"e2b-envd-compatible-api",
"vminitd is not envd; a guest envd or deliberate envd bridge is required",
),
RuntimeCapability::unsupported(
"snapshot-backed-pause-resume-connect",
"VZ save/restore exists below this layer, but the E2B-compatible sandbox snapshot lifecycle is not implemented",
),
RuntimeCapability::unsupported(
"e2b-network-policy",
"Current APIs attach/configure interfaces but do not enforce allow/deny/mask policy",
),
RuntimeCapability::unsupported(
"domain-host-proxy",
"The crate exposes vsock/socket relay primitives, not the E2B {port}-{sandboxID}.domain proxy",
),
RuntimeCapability::unsupported(
"template-build-service",
"Image and rootfs operations exist, but the E2B template builder/control-plane service is external",
),
];
#[must_use]
pub const fn apple_local_runtime_capabilities() -> RuntimeCapabilities {
RuntimeCapabilities::new(
"apple-vz",
APPLE_LOCAL_RUNTIME_SUPPORTED_CAPABILITIES,
APPLE_LOCAL_RUNTIME_UNSUPPORTED_CAPABILITIES,
)
}
pub mod core {
pub use firkin_core::*;
}
pub mod ext4 {
pub use firkin_ext4::*;
}
pub mod e2b {
#[allow(unused_imports, ambiguous_glob_reexports)]
pub use {firkin_e2b_contract::*, firkin_e2b_server::*, firkin_e2b_wire::*};
}
pub mod envd {
pub use firkin_envd::*;
}
pub mod oci {
pub use firkin_oci::*;
}
pub mod sandbox {
pub use firkin_sandbox::*;
pub mod apple_vz {
pub use firkin_single_node::{AppleVzBackend, SingleNodeConfig};
}
}
pub mod substrate {
#[allow(unused_imports, ambiguous_glob_reexports)]
pub use {
firkin_admission::*, firkin_artifacts::*, firkin_evidence::*, firkin_hygiene::*,
firkin_template::*,
};
}
pub mod trace {
pub use firkin_trace::*;
}
pub mod benchmark {
pub use firkin_benchmark::*;
}
pub mod evidence {
pub use firkin_evidence::*;
}
pub mod runtime {
pub use firkin_runtime::*;
#[allow(missing_docs)]
pub mod single_node {
#[allow(unused_imports, ambiguous_glob_reexports)]
pub use firkin_single_node::*;
}
}
pub mod template {
pub use firkin_template::*;
}
pub mod types {
pub use firkin_types::*;
}
pub mod vminitd_client {
pub use firkin_vminitd_client::*;
}
pub mod vminitd_bytes {
pub use firkin_vminitd_bytes::*;
}
pub mod vmm {
pub use firkin_vmm::*;
}
pub mod vsock {
pub use firkin_vsock::*;
}
pub mod prelude {
pub use crate::{
RuntimeCapabilities, RuntimeCapability, UnsupportedRuntimeCapability,
apple_local_runtime_capabilities,
};
pub use firkin_core::{
Capability, ChildStderr, ChildStdin, ChildStdout, Container, ContainerBuilder,
ContainerStatistics, CoreContainerFactory, DnsConfig, EmptyDirMedium, EmptyDirVolume,
ExecConfig, FileMount, GuestFilesystem, GuestPath, HostsConfig, HostsEntry, ImplicitVm,
Init, InvalidCapability, InvalidRlimit, LinuxCapabilities, LinuxRlimit, MaterializedRootfs,
Mount, MountedPodStore, OnVm, Pod, PodBuilder, PodContainerSpec, PodId, PodRootfsSource,
PodStoreSpec, PodVolumeMount, Process, PtyConfig, Ready, ReadyPty, RlimitKind, Rootfs,
Seccomp, SeccompAction, SeccompArch, SeccompArgRule, SeccompFlag, SeccompOp,
SeccompSyscallRule, SocketDirection, StatCategory, Stdio, Streams, UnixSocketConfig, User,
VmRootfs, materialize_rootfs_in_pod_store, mount_pod_store,
};
pub use firkin_sandbox::prelude::*;
pub use firkin_types::{
ContainerId, Hostname, InvalidNetworkPolicyRule, InvalidPortSandboxHost, NetworkPolicyRule,
Platform, PortSandboxHost, ProcessId, SandboxNetworkPolicy, Size, VirtiofsTag, VsockPort,
};
pub use firkin_vmm::{
BlankDiskImage, BootLog, DiskImageFormat, KernelImage, Network, VirtualMachine, VmConfig,
create_blank_disk_image,
};
pub use firkin_vsock::VsockStream;
}
pub use firkin_core::{
BlockIoDevice, BlockIoStatistics, Capability, ChildStderr, ChildStdin, ChildStdout, Container,
ContainerBuilder, ContainerStatistics, ContainerStatisticsQuery, CoreContainerFactory,
CpuStatistics, DnsConfig, EmptyDirMedium, EmptyDirVolume, ExecConfig, FileMount,
GuestFilesystem, GuestPath, HostsConfig, HostsEntry, ImplicitVm, Init, InvalidCapability,
InvalidRlimit, LinuxCapabilities, LinuxRlimit, MaterializedRootfs, MemoryEventStatistics,
MemoryStatistics, Mount, MountedPodStore, NetworkStatistics, OnVm, OnVmArc, Pod, PodBuilder,
PodContainerSpec, PodId, PodRootfsSource, PodStoreSpec, PodVolumeMount, Process,
ProcessKillHandle, ProcessStatistics, Pty, PtyConfig, Ready, ReadyPty, RlimitKind, Rootfs,
Seccomp, SeccompAction, SeccompArch, SeccompArgRule, SeccompFlag, SeccompOp,
SeccompSyscallRule, SocketDirection, StatCategory, Stdio, Streams, UnixSocketConfig, User,
VmRootfs, materialize_rootfs_in_pod_store, mount_pod_store,
};
pub use firkin_types::{
ContainerId, Hostname, InvalidNetworkPolicyRule, InvalidPortSandboxHost, NetworkPolicyRule,
Platform, PortSandboxHost, ProcessId, SandboxNetworkPolicy, Size, VirtiofsTag, VsockPort,
};
pub use firkin_vmm::{
BlankDiskImage, BootLog, DiskImageFormat, KernelImage, Network, VirtualMachine, VmConfig,
create_blank_disk_image,
};
pub use firkin_vsock::{VsockListener, VsockPeer, VsockStream};