| 4599 | } |
| 4600 | |
| 4601 | fn prepare_sandbox_overlay_image( |
| 4602 | template_path: &Path, |
| 4603 | overlay_disk: &Path, |
| 4604 | tls_materials: Option<&GuestTlsMaterials>, |
| 4605 | sandbox_token: Option<&str>, |
| 4606 | preparation: OverlayPreparation, |
| 4607 | expected_size_bytes: u64, |
| 4608 | ) -> Result<(), String> { |
| 4609 | if preparation == OverlayPreparation::PreserveExisting { |
| 4610 | match fs::metadata(overlay_disk) { |
| 4611 | Ok(metadata) if metadata.is_file() && metadata.len() == expected_size_bytes => { |
| 4612 | if let Some(tls) = tls_materials { |
| 4613 | inject_guest_tls_materials(overlay_disk, tls)?; |
| 4614 | } |
| 4615 | if let Some(token) = sandbox_token { |
| 4616 | inject_guest_sandbox_token(overlay_disk, token)?; |
| 4617 | } |
| 4618 | return Ok(()); |
| 4619 | } |
| 4620 | Ok(metadata) if metadata.is_file() => { |
| 4621 | return Err(format!( |
| 4622 | "existing overlay disk '{}' has size {}, expected {}", |
| 4623 | overlay_disk.display(), |
| 4624 | metadata.len(), |
| 4625 | expected_size_bytes |
| 4626 | )); |
| 4627 | } |
| 4628 | Ok(_) => { |
| 4629 | return Err(format!( |
| 4630 | "existing overlay path '{}' is not a file", |
| 4631 | overlay_disk.display() |
| 4632 | )); |
| 4633 | } |
| 4634 | Err(err) if err.kind() == std::io::ErrorKind::NotFound => {} |
| 4635 | Err(err) => { |
| 4636 | return Err(format!( |
| 4637 | "stat overlay disk {}: {err}", |
| 4638 | overlay_disk.display() |
| 4639 | )); |
| 4640 | } |
| 4641 | } |
| 4642 | } |
| 4643 | |
| 4644 | create_sandbox_overlay_image_from_template( |
| 4645 | template_path, |
| 4646 | overlay_disk, |
| 4647 | tls_materials, |
| 4648 | sandbox_token, |
| 4649 | ) |
| 4650 | } |
| 4651 | |
| 4652 | fn inject_guest_tls_materials( |
| 4653 | overlay_disk: &Path, |