1pub mod audit;
7pub mod compose;
8pub mod config;
9pub mod dns;
10pub mod env;
11pub mod error;
12pub mod event;
13pub mod exec;
14pub mod execution;
15pub mod fs_atomic;
16pub mod guest_exec;
17pub mod lifecycle_profile;
18pub mod log;
19pub mod network;
20pub mod operator;
21pub mod platform;
22pub mod port;
23pub mod pty;
24pub mod rootfs_baseline;
25pub mod rootfs_metadata;
26pub mod scale;
27pub mod secret;
28pub mod security;
29pub mod snapshot;
30pub mod tee;
31pub mod traits;
32pub mod vmm;
33pub mod volume;
34#[cfg(windows)]
35pub mod windows_file;
36#[cfg(windows)]
37pub mod windows_symlink;
38
39pub use audit::{AuditAction, AuditConfig, AuditEvent, AuditOutcome};
41pub use compose::ComposeConfig;
42pub use config::{BoxConfig, ExecutionIsolation, ResourceConfig, ResourceLimits};
43pub use error::{BoxError, Result};
44pub use event::{BoxEvent, EventEmitter};
45pub use exec::{ExecChunk, ExecEvent, ExecExit, ExecMetrics, StreamType};
46pub use exec::{ExecOutput, ExecRequest};
47pub use exec::{
48 FileOp, FileRequest, FileResponse, FilesystemEntry, FilesystemEntryKind, FilesystemOp,
49 FilesystemRequest, FilesystemResponse, GuestSessionRequest, MAX_BOUNDED_FILE_BYTES,
50};
51pub use exec::{EXEC_VSOCK_PORT, PORT_FWD_VSOCK_PORT};
52pub use execution::{
53 resolve_execution, validate_microvm_compatibility, validate_sandbox_compatibility,
54 ExecutionBackend, IsolationClass, ResolvedExecutionPlan,
55};
56pub use network::{IsolationMode, NetworkConfig, NetworkEndpoint, NetworkMode, NetworkPolicy};
57pub use operator::{BoxAutoscaler, BoxAutoscalerSpec, BoxAutoscalerStatus, MetricType};
58pub use platform::{
59 BridgeNetworkBackend, HostGuestChannel, Platform, PlatformCapabilities, VmBackend,
60};
61pub use port::{normalize_port_maps, parse_port_mapping, PortMapping, PortProtocol};
62pub use pty::PTY_VSOCK_PORT;
63pub use scale::{
64 InstanceDeregistration, InstanceEvent, InstanceHealth, InstanceInfo, InstanceRegistration,
65 InstanceState, ScaleConfig, ScaleDirection, ScaleObservation, ScaleOperationConflict,
66 ScaleOperationRequest, ScaleOperationResponse, ScaleRequest, ScaleResponse,
67 SCALE_OPERATION_SCHEMA_VERSION,
68};
69pub use security::{SeccompMode, SecurityConfig};
70pub use snapshot::{
71 SnapshotConfig, SnapshotImageConfig, SnapshotImageHealthCheck, SnapshotMetadata,
72};
73pub use tee::ATTEST_VSOCK_PORT;
74pub use tee::{detect_tee, is_tee_available, TeeCapability, TeeType};
75pub use traits::{
76 AuditSink, CacheBackend, CacheEntry, CacheStats, CreateExecutionRequest, CredentialProvider,
77 EventBus, ExecutionCpuStats, ExecutionEventBatch, ExecutionEventKind, ExecutionEventsRequest,
78 ExecutionGeneration, ExecutionHealthCheck, ExecutionId, ExecutionLease, ExecutionManager,
79 ExecutionManagerError, ExecutionManagerResult, ExecutionMemoryStats, ExecutionPortConnector,
80 ExecutionPortIo, ExecutionPortStream, ExecutionProcess, ExecutionProcessInfo,
81 ExecutionProcessInput, ExecutionProcessInventory, ExecutionProcessSignal,
82 ExecutionProcessStream, ExecutionRecordPolicy, ExecutionReservation, ExecutionResourceUpdate,
83 ExecutionRestartPolicy, ExecutionRuntimeEvent, ExecutionSessionManager, ExecutionSnapshot,
84 ExecutionSnapshotId, ExecutionState, ExecutionStats, ExecutionStatus, ImageRegistry,
85 ImageStoreBackend, KillExecutionOptions, KillOutcome, MetricsCollector, NetworkStoreBackend,
86 NoopMetrics, OperationId, PulledImage, ReconcileOutcome, RestartExecutionOptions,
87 SnapshotStoreBackend, StoredImage, VolumeStoreBackend, MAX_EXECUTION_EVENT_BATCH_ITEMS,
88};
89pub use vmm::{
90 Entrypoint, FsMount, InstanceSpec, NetworkInstanceConfig, RawBlockDevice, TeeInstanceConfig,
91 VmHandler, VmMetrics, VmmProvider, DEFAULT_SHUTDOWN_TIMEOUT_MS,
92};
93pub use volume::VolumeConfig;
94
95pub const VERSION: &str = env!("CARGO_PKG_VERSION");
97
98pub fn dirs_home() -> std::path::PathBuf {
105 if let Ok(home) = std::env::var("A3S_HOME") {
106 return std::path::PathBuf::from(home);
107 }
108 dirs::home_dir()
109 .map(|h| h.join(".a3s"))
110 .unwrap_or_else(|| std::path::PathBuf::from(".a3s"))
111}
112
113#[cfg(test)]
114mod tests {
115 use super::*;
116 use std::sync::Mutex;
117
118 static ENV_LOCK: Mutex<()> = Mutex::new(());
119
120 #[test]
121 fn dirs_home_prefers_a3s_home_environment_variable() {
122 let _guard = ENV_LOCK.lock().unwrap();
123 let previous = std::env::var_os("A3S_HOME");
124 let tmp = tempfile::tempdir().unwrap();
125
126 std::env::set_var("A3S_HOME", tmp.path());
127 assert_eq!(dirs_home(), tmp.path());
128
129 match previous {
130 Some(value) => std::env::set_var("A3S_HOME", value),
131 None => std::env::remove_var("A3S_HOME"),
132 }
133 }
134
135 #[test]
136 fn dirs_home_defaults_to_dot_a3s_under_user_home_when_env_absent() {
137 let _guard = ENV_LOCK.lock().unwrap();
138 let previous = std::env::var_os("A3S_HOME");
139
140 std::env::remove_var("A3S_HOME");
141 let home = dirs_home();
142
143 assert!(home.ends_with(".a3s"));
144 if let Some(user_home) = dirs::home_dir() {
145 assert_eq!(home, user_home.join(".a3s"));
146 }
147
148 match previous {
149 Some(value) => std::env::set_var("A3S_HOME", value),
150 None => std::env::remove_var("A3S_HOME"),
151 }
152 }
153}