mirror of
https://github.com/edera-dev/krata.git
synced 2025-08-03 21:21:32 +00:00
hypha: protect from panics in the network stack (due to interface going away)
This commit is contained in:
@ -110,15 +110,10 @@ fn main() -> Result<()> {
|
|||||||
Commands::List { .. } => {
|
Commands::List { .. } => {
|
||||||
let containers = controller.list()?;
|
let containers = controller.list()?;
|
||||||
let mut table = cli_tables::Table::new();
|
let mut table = cli_tables::Table::new();
|
||||||
let header = vec!["domain", "uuid", "ipv4", "image"];
|
let header = vec!["uuid", "ipv4", "image"];
|
||||||
table.push_row(&header)?;
|
table.push_row(&header)?;
|
||||||
for container in containers {
|
for container in containers {
|
||||||
let row = vec![
|
let row = vec![container.uuid.to_string(), container.ipv4, container.image];
|
||||||
container.domid.to_string(),
|
|
||||||
container.uuid.to_string(),
|
|
||||||
container.ipv4,
|
|
||||||
container.image,
|
|
||||||
];
|
|
||||||
table.push_row_string(&row)?;
|
table.push_row_string(&row)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
use std::os::fd::AsRawFd;
|
use std::os::fd::AsRawFd;
|
||||||
|
use std::panic::UnwindSafe;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::thread;
|
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
use std::{panic, thread};
|
||||||
|
|
||||||
use advmac::MacAddr6;
|
use advmac::MacAddr6;
|
||||||
use anyhow::{anyhow, Result};
|
use anyhow::{anyhow, Result};
|
||||||
@ -21,6 +22,7 @@ pub struct NetworkBackend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl Send for NetworkBackend {}
|
unsafe impl Send for NetworkBackend {}
|
||||||
|
impl UnwindSafe for NetworkBackend {}
|
||||||
|
|
||||||
pub struct NetworkService {
|
pub struct NetworkService {
|
||||||
pub network: String,
|
pub network: String,
|
||||||
@ -66,10 +68,25 @@ impl NetworkBackend {
|
|||||||
}
|
}
|
||||||
let link = link.unwrap();
|
let link = link.unwrap();
|
||||||
handle.link().set(link.header.index).up().execute().await?;
|
handle.link().set(link.header.index).up().execute().await?;
|
||||||
|
tokio::time::sleep(Duration::from_secs(3)).await;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run(&mut self) -> Result<()> {
|
pub fn run(mut self) -> Result<()> {
|
||||||
|
let interface = self.interface.clone();
|
||||||
|
let result = panic::catch_unwind(move || self.run_maybe_panic());
|
||||||
|
|
||||||
|
if result.is_err() {
|
||||||
|
return Err(anyhow!(
|
||||||
|
"network backend for interface {} encountered an error and is now shutdown",
|
||||||
|
interface
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
result.unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_maybe_panic(&mut self) -> Result<()> {
|
||||||
let mac = MacAddr6::random();
|
let mac = MacAddr6::random();
|
||||||
let mac = HardwareAddress::Ethernet(EthernetAddress(mac.to_array()));
|
let mac = HardwareAddress::Ethernet(EthernetAddress(mac.to_array()));
|
||||||
let config = Config::new(mac);
|
let config = Config::new(mac);
|
||||||
@ -128,14 +145,16 @@ impl NetworkService {
|
|||||||
spawned.push(name);
|
spawned.push(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(Duration::from_secs(5)).await;
|
sleep(Duration::from_secs(2)).await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn add_network_backend(&mut self, interface: &str) -> Result<()> {
|
async fn add_network_backend(&mut self, interface: &str) -> Result<()> {
|
||||||
let interface = interface.to_string();
|
let interface = interface.to_string();
|
||||||
let mut network = NetworkBackend::new(&interface, &[&self.network])?;
|
let mut network = NetworkBackend::new(&interface, &[&self.network])?;
|
||||||
|
info!("initializing network backend for interface {}", interface);
|
||||||
network.init().await?;
|
network.init().await?;
|
||||||
|
tokio::time::sleep(Duration::from_secs(1)).await;
|
||||||
info!("spawning network backend for interface {}", interface);
|
info!("spawning network backend for interface {}", interface);
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
if let Err(error) = network.run() {
|
if let Err(error) = network.run() {
|
||||||
|
Reference in New Issue
Block a user