Replace external reachability with an owned canary

This commit is contained in:
ms2k 2026-07-19 22:39:31 +09:00
commit 31e9ab0f2d
3 changed files with 1409 additions and 1972 deletions

View file

@ -1,12 +1,12 @@
use super::{
Arc, ContainerId, ControlError, CoordinatorId, DomainId, GenerationId, HashMap,
HostCoordinatorDomainStore, HostCoordinatorTerminalRecorder, InteractiveControlSession,
InteractiveSessionBatch, InteractiveSessionEvent, InteractiveSessionExecutor,
InteractiveSessionMessage, InteractiveSessionRequest, Mutex, OsString, PathBuf,
PidfsProcessIdentityV1, PromptRouteCancellation, ProtocolVersion, RunscSessionTerminalFactory,
SessionId, SessionPromptTransport, SessionTerminal, SessionTerminalEvent,
SessionTerminalFactory, SessionTerminalMessage, SessionTerminalProcess, TerminalAcquisition,
TerminalError, TerminalLoss, TerminalRoute, VecDeque,
Arc, BTreeMap, ContainerId, ControlError, CoordinatorId, DomainId, EnvironmentValue,
GenerationId, HashMap, HostCoordinatorDomainStore, HostCoordinatorTerminalRecorder,
InteractiveControlSession, InteractiveSessionBatch, InteractiveSessionEvent,
InteractiveSessionExecutor, InteractiveSessionMessage, InteractiveSessionRequest, Mutex,
OsString, PathBuf, PidfsProcessIdentityV1, PromptRouteCancellation, ProtocolVersion,
RunscSessionTerminalFactory, SessionId, SessionPromptTransport, SessionTerminal,
SessionTerminalEvent, SessionTerminalFactory, SessionTerminalMessage, SessionTerminalProcess,
TerminalAcquisition, TerminalError, TerminalLoss, TerminalRoute, VecDeque,
};
pub(super) struct ActiveTerminal {
@ -36,6 +36,7 @@ pub struct RunscInteractiveSessionExecutor {
host_coordinator: PidfsProcessIdentityV1,
runsc_program: OsString,
runsc_global_arguments: Vec<OsString>,
environment: BTreeMap<String, EnvironmentValue>,
runtime_root: PathBuf,
}
@ -50,6 +51,7 @@ impl RunscInteractiveSessionExecutor {
container_id: ContainerId,
host_coordinator: PidfsProcessIdentityV1,
command: &lazaret_runtime_supervisor::sandbox::RunscCommand,
environment: BTreeMap<String, EnvironmentValue>,
runtime_root: PathBuf,
) -> Result<Self, TerminalError> {
let run = command
@ -75,6 +77,7 @@ impl RunscInteractiveSessionExecutor {
host_coordinator,
runsc_program: command.program().to_owned(),
runsc_global_arguments: command.arguments()[..run].to_vec(),
environment,
runtime_root,
})
}
@ -104,6 +107,7 @@ impl InteractiveSessionExecutor for RunscInteractiveSessionExecutor {
host_coordinator: self.host_coordinator,
runsc_program: self.runsc_program.clone(),
runsc_global_arguments: self.runsc_global_arguments.clone(),
environment: self.environment.clone(),
internal_pid_file: self.runtime_root.join(format!(
"session-{}.pid",
hex_session(request.session_id.as_bytes())

View file

@ -45,8 +45,19 @@ impl SessionTerminalFactory for RunscSessionTerminalFactory {
for argument in &request.runsc_global_arguments {
target = target.argument(argument.clone());
}
target = target.argument("exec");
if !request.environment.contains_key("PATH") {
target = target
.argument("-env")
.argument(format!("PATH={}", crate::sandbox_init::DEFAULT_AGENT_PATH));
}
for (name, value) in &request.environment {
let mut assignment = OsString::from(name);
assignment.push("=");
assignment.push(value.expose());
target = target.argument("-env").argument(assignment);
}
target = target
.argument("exec")
.argument(format!(
"-internal-pid-file={}",
request.internal_pid_file.display()

View file

@ -526,6 +526,7 @@ fn acquisition(session_id: SessionId) -> TerminalAcquisition {
host_coordinator: process(70),
runsc_program: "runsc".into(),
runsc_global_arguments: Vec::new(),
environment: BTreeMap::new(),
internal_pid_file: "/tmp/not-used-by-mock".into(),
argv: vec![b"/bin/agent".to_vec()],
}