diff --git a/build/dpkg-deps/depends b/build/dpkg-deps/depends
index 4c2dbc557..5b5821569 100644
--- a/build/dpkg-deps/depends
+++ b/build/dpkg-deps/depends
@@ -43,6 +43,7 @@ podman
postgresql
psmisc
qemu-guest-agent
+rfkill
rsync
samba-common-bin
smartmontools
diff --git a/core/Cargo.lock b/core/Cargo.lock
index db92c1ff9..87edff8ac 100644
--- a/core/Cargo.lock
+++ b/core/Cargo.lock
@@ -5952,7 +5952,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]]
name = "start-os"
-version = "0.3.6-alpha.15"
+version = "0.4.0-alpha.0"
dependencies = [
"aes 0.7.5",
"async-acme",
diff --git a/core/startos/Cargo.toml b/core/startos/Cargo.toml
index dbcaf2a78..2801fc667 100644
--- a/core/startos/Cargo.toml
+++ b/core/startos/Cargo.toml
@@ -14,7 +14,7 @@ keywords = [
name = "start-os"
readme = "README.md"
repository = "https://github.com/Start9Labs/start-os"
-version = "0.3.6-alpha.15" # VERSION_BUMP
+version = "0.4.0-alpha.0" # VERSION_BUMP
license = "MIT"
[lib]
diff --git a/core/startos/src/account.rs b/core/startos/src/account.rs
index 3de55dfb3..46fd2c1f9 100644
--- a/core/startos/src/account.rs
+++ b/core/startos/src/account.rs
@@ -59,7 +59,13 @@ impl AccountInfo {
let hostname = Hostname(db.as_public().as_server_info().as_hostname().de()?);
let password = db.as_private().as_password().de()?;
let key_store = db.as_private().as_key_store();
- let tor_addrs = db.as_public().as_server_info().as_host().as_onions().de()?;
+ let tor_addrs = db
+ .as_public()
+ .as_server_info()
+ .as_network()
+ .as_host()
+ .as_onions()
+ .de()?;
let tor_keys = tor_addrs
.into_iter()
.map(|tor_addr| key_store.as_onion().get_key(&tor_addr))
@@ -89,13 +95,17 @@ impl AccountInfo {
server_info
.as_pubkey_mut()
.ser(&self.ssh_key.public_key().to_openssh()?)?;
- server_info.as_host_mut().as_onions_mut().ser(
- &self
- .tor_keys
- .iter()
- .map(|tor_key| tor_key.public().get_onion_address())
- .collect(),
- )?;
+ server_info
+ .as_network_mut()
+ .as_host_mut()
+ .as_onions_mut()
+ .ser(
+ &self
+ .tor_keys
+ .iter()
+ .map(|tor_key| tor_key.public().get_onion_address())
+ .collect(),
+ )?;
db.as_private_mut().as_password_mut().ser(&self.password)?;
db.as_private_mut()
.as_ssh_privkey_mut()
diff --git a/core/startos/src/bins/startd.rs b/core/startos/src/bins/startd.rs
index 01e6ac916..0ec28d67d 100644
--- a/core/startos/src/bins/startd.rs
+++ b/core/startos/src/bins/startd.rs
@@ -1,6 +1,5 @@
use std::cmp::max;
use std::ffi::OsString;
-use std::net::IpAddr;
use std::sync::Arc;
use std::time::Duration;
@@ -14,7 +13,6 @@ use crate::context::config::ServerConfig;
use crate::context::rpc::InitRpcContextPhases;
use crate::context::{DiagnosticContext, InitContext, RpcContext};
use crate::net::network_interface::SelfContainedNetworkInterfaceListener;
-use crate::net::utils::ipv6_is_local;
use crate::net::web_server::{Acceptor, UpgradableListener, WebServer};
use crate::shutdown::Shutdown;
use crate::system::launch_metrics_task;
diff --git a/core/startos/src/context/rpc.rs b/core/startos/src/context/rpc.rs
index 96ca3ca63..927fc36ed 100644
--- a/core/startos/src/context/rpc.rs
+++ b/core/startos/src/context/rpc.rs
@@ -1,4 +1,3 @@
-use std::backtrace;
use std::collections::{BTreeMap, BTreeSet};
use std::future::Future;
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
@@ -41,7 +40,7 @@ use crate::service::effects::callbacks::ServiceCallbacks;
use crate::service::ServiceMap;
use crate::shutdown::Shutdown;
use crate::util::lshw::LshwDevice;
-use crate::util::sync::SyncMutex;
+use crate::util::sync::{SyncMutex, Watch};
pub struct RpcContextSeed {
is_closed: AtomicBool,
@@ -57,14 +56,14 @@ pub struct RpcContextSeed {
pub os_net_service: NetService,
pub s9pk_arch: Option<&'static str>,
pub services: ServiceMap,
- pub metrics_cache: RwLock