From d608ffeeda1a479c9dc0e5f6ad269ba07a510d7f Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Fri, 30 Oct 2026 03:10:41 +0400 Subject: Implement Linux proxy controller, subscription state, and CLI/TUI --- src/runtime.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/runtime.rs (limited to 'src/runtime.rs') diff --git a/src/runtime.rs b/src/runtime.rs new file mode 100644 index 0000000..96ffd0d --- /dev/null +++ b/src/runtime.rs @@ -0,0 +1,34 @@ +use crate::model::Trojan; +use anyhow::{Result, bail}; +use async_trait::async_trait; + +#[async_trait] +pub trait Runtime: Send { + /// Protection must be installed before durable enabled intent changes. + async fn arm(&mut self) -> Result<()>; + async fn apply(&mut self, connection: Option<&Trojan>, generation: u64) -> Result<()>; + async fn maintain(&mut self, connection: Option<&Trojan>, generation: u64) -> Result<()> { + self.apply(connection, generation).await + } + /// Called only after disabled intent has been durably recorded. + async fn disable(&mut self) -> Result<()>; + fn routing(&self) -> &str; +} + +/// Allows managing saved subscriptions without claiming that host capture is available. +pub struct OfflineRuntime; +#[async_trait] +impl Runtime for OfflineRuntime { + async fn arm(&mut self) -> Result<()> { + bail!("Host networking is unavailable; install and start the Roentgen service") + } + async fn apply(&mut self, _: Option<&Trojan>, _: u64) -> Result<()> { + bail!("Host networking is unavailable") + } + async fn disable(&mut self) -> Result<()> { + Ok(()) + } + fn routing(&self) -> &str { + "unavailable" + } +} -- cgit v1.2.3