pub mod autofill;
pub mod bootlog;
pub mod bootstrap;
pub mod boxloop;
pub mod boxside;
pub mod door;
pub mod duty;
pub mod frontside;
pub mod installer;
pub mod installer_link;
pub mod elect;
pub mod egress;
pub mod fed_at_rest;
pub mod feedbus;
pub mod fleet;
pub mod join;
#[cfg(feature = "kept")]
pub mod kept;
pub mod live;
pub mod mtls;
pub mod narrator;
pub mod pair;
pub mod pqtls;
pub mod redact;
pub mod seed;
pub mod signal;
pub mod tunnel;
#[cfg(feature = "wireguard")]
pub mod wireguard;
#[cfg(feature = "mullvad")]
pub mod mullvad;
#[cfg(feature = "tailscale")]
pub mod tailscale;
use std::net::Ipv4Addr;
pub const OVERLAY_NET: (Ipv4Addr, u8) = (Ipv4Addr::new(10, 44, 0, 0), 24);
pub const OVERLAY_FRONT: Ipv4Addr = Ipv4Addr::new(10, 44, 0, 1);
pub const OVERLAY_BOX_A: Ipv4Addr = Ipv4Addr::new(10, 44, 0, 2);
pub const OVERLAY_BOX_B: Ipv4Addr = Ipv4Addr::new(10, 44, 0, 3);
pub const CONTROL_PORT: u16 = 50051;
pub const RELAY_PORT: u16 = 51820;
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Role {
Front,
Primary,
Twin,
}
impl Role {
pub fn as_str(self) -> &'static str {
match self {
Role::Front => "front",
Role::Primary => "primary",
Role::Twin => "twin",
}
}
}
pub fn in_overlay(ip: Ipv4Addr) -> bool {
let (net, bits) = OVERLAY_NET;
let mask = if bits == 0 { 0 } else { u32::MAX << (32 - bits) };
(u32::from(ip) & mask) == (u32::from(net) & mask)
}
#[cfg(test)]
pub(crate) fn heard<R>(f: impl FnOnce() -> R) -> (R, String) {
#[derive(Clone, Default)]
struct Heard(std::sync::Arc<std::sync::Mutex<Vec<u8>>>);
impl std::io::Write for Heard {
fn write(&mut self, b: &[u8]) -> std::io::Result<usize> {
self.0.lock().unwrap().extend_from_slice(b);
Ok(b.len())
}
fn flush(&mut self) -> std::io::Result<()> {
Ok(())
}
}
let h = Heard::default();
let w = h.clone();
let sub = tracing_subscriber::fmt().with_writer(move || w.clone()).with_ansi(false).finish();
let r = tracing::subscriber::with_default(sub, f);
let said = String::from_utf8(h.0.lock().unwrap().clone()).unwrap();
(r, said)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_overlay_is_ours_and_the_three_addresses_are_in_it() {
assert!(in_overlay(OVERLAY_FRONT) && in_overlay(OVERLAY_BOX_A) && in_overlay(OVERLAY_BOX_B));
assert!(!in_overlay(Ipv4Addr::new(10, 13, 8, 179)), "a UpCloud utility address is not overlay");
assert_ne!(OVERLAY_BOX_A, OVERLAY_BOX_B);
}
}