use std::collections::{HashMap, HashSet};
pub struct ResourceState {
pub proc_count: u32,
pub max_processes: u32,
pub mem_used: u64,
pub max_memory_bytes: u64,
pub brk_bases: HashMap<i32, u64>,
pub hold_forks: bool,
pub held_notif_ids: Vec<u64>,
pub load_avg: crate::procfs::LoadAvg,
pub start_instant: std::time::Instant,
}
impl ResourceState {
pub fn new(max_memory_bytes: u64, max_processes: u32) -> Self {
Self {
proc_count: 0,
max_processes,
mem_used: 0,
max_memory_bytes,
brk_bases: HashMap::new(),
hold_forks: false,
held_notif_ids: Vec::new(),
load_avg: crate::procfs::LoadAvg::new(),
start_instant: std::time::Instant::now(),
}
}
}
pub struct ProcfsState {
pub proc_pids: HashSet<i32>,
pub getdents_cache: HashMap<(i32, u32), Vec<Vec<u8>>>,
pub vdso_patched_addr: u64,
}
impl ProcfsState {
pub fn new() -> Self {
Self {
proc_pids: HashSet::new(),
getdents_cache: HashMap::new(),
vdso_patched_addr: 0,
}
}
}
pub struct CowState {
pub branch: Option<crate::cow::seccomp::SeccompCowBranch>,
pub dir_cache: HashMap<(i32, u32), (String, Vec<Vec<u8>>)>,
}
impl CowState {
pub fn new() -> Self {
Self {
branch: None,
dir_cache: HashMap::new(),
}
}
}
pub struct NetworkState {
pub network_policy: crate::seccomp::notif::NetworkPolicy,
pub port_map: crate::port_remap::PortMap,
pub pid_ip_overrides: std::sync::Arc<std::sync::RwLock<HashMap<u32, HashSet<std::net::IpAddr>>>>,
pub http_acl_addr: Option<std::net::SocketAddr>,
pub http_acl_ports: HashSet<u16>,
pub http_acl_orig_dest: Option<crate::http_acl::OrigDestMap>,
}
impl NetworkState {
pub fn new() -> Self {
Self {
network_policy: crate::seccomp::notif::NetworkPolicy::Unrestricted,
port_map: crate::port_remap::PortMap::new(),
pid_ip_overrides: std::sync::Arc::new(std::sync::RwLock::new(HashMap::new())),
http_acl_addr: None,
http_acl_ports: HashSet::new(),
http_acl_orig_dest: None,
}
}
pub fn effective_network_policy(
&self,
pid: u32,
live_policy: Option<&std::sync::Arc<std::sync::RwLock<crate::policy_fn::LivePolicy>>>,
) -> crate::seccomp::notif::NetworkPolicy {
if let Ok(overrides) = self.pid_ip_overrides.read() {
if let Some(ips) = overrides.get(&pid) {
return crate::seccomp::notif::NetworkPolicy::AllowList(ips.clone());
}
}
if let Some(lp) = live_policy {
if let Ok(live) = lp.read() {
if !live.allowed_ips.is_empty() {
return crate::seccomp::notif::NetworkPolicy::AllowList(live.allowed_ips.clone());
}
}
}
self.network_policy.clone()
}
}
pub struct TimeRandomState {
pub time_offset: Option<i64>,
pub random_state: Option<rand_chacha::ChaCha8Rng>,
}
impl TimeRandomState {
pub fn new(time_offset: Option<i64>, random_state: Option<rand_chacha::ChaCha8Rng>) -> Self {
Self { time_offset, random_state }
}
}
pub struct PolicyFnState {
pub event_tx: Option<tokio::sync::mpsc::UnboundedSender<crate::policy_fn::PolicyEvent>>,
pub live_policy: Option<std::sync::Arc<std::sync::RwLock<crate::policy_fn::LivePolicy>>>,
pub denied_paths: std::sync::Arc<std::sync::RwLock<HashSet<String>>>,
}
impl PolicyFnState {
pub fn new() -> Self {
Self {
event_tx: None,
live_policy: None,
denied_paths: std::sync::Arc::new(std::sync::RwLock::new(HashSet::new())),
}
}
pub fn is_path_denied(&self, path: &str) -> bool {
if let Ok(denied) = self.denied_paths.read() {
let path = std::path::Path::new(path);
denied.iter().any(|d| path.starts_with(std::path::Path::new(d)))
} else {
false
}
}
}
pub struct ChrootState {
pub chroot_exe: Option<std::path::PathBuf>,
}
impl ChrootState {
pub fn new() -> Self {
Self { chroot_exe: None }
}
}