Merge vl1-service into service for simplicity and because they are parts of the same thing.

This commit is contained in:
Adam Ierymenko 2023-03-28 10:41:57 -04:00
parent 1670a3aa31
commit b97ed1e97a
21 changed files with 89 additions and 103 deletions

View file

@ -5,7 +5,6 @@ members = [
"network-hypervisor",
"controller",
"service",
"vl1-service",
"utils",
]

View file

@ -11,7 +11,7 @@ path = "src/main.rs"
zerotier-crypto = { path = "../crypto" }
zerotier-utils = { path = "../utils", features = ["tokio"] }
zerotier-network-hypervisor = { path = "../network-hypervisor" }
zerotier-vl1-service = { path = "../vl1-service" }
zerotier-service = { path = "../service" }
async-trait = "^0"
serde = { version = "^1", features = ["derive"], default-features = false }
serde_json = { version = "^1", features = ["std"], default-features = false }

View file

@ -5,6 +5,11 @@ authors = ["ZeroTier, Inc. <contact@zerotier.com>", "Adam Ierymenko <adam.ieryme
edition = "2021"
license = "MPL-2.0"
[lib]
name = "zerotier_service"
path = "src/lib.rs"
doc = true
[[bin]]
name = "zerotier"
path = "src/main.rs"
@ -13,10 +18,10 @@ path = "src/main.rs"
zerotier-network-hypervisor = { path = "../network-hypervisor" }
zerotier-crypto = { path = "../crypto" }
zerotier-utils = { path = "../utils", features = ["tokio"] }
zerotier-vl1-service = { path = "../vl1-service" }
serde = { version = "^1", features = ["derive"], default-features = false }
serde_json = { version = "^1", features = ["std"], default-features = false }
clap = { version = "^3", features = ["std", "suggestions"], default-features = false }
num-traits = "^0"
[target."cfg(windows)".dependencies]
winapi = { version = "^0", features = ["handleapi", "ws2ipdef", "ws2tcpip"] }

View file

@ -1,3 +1,10 @@
// (c) 2020-2022 ZeroTier, Inc. -- currently proprietary pending actual release and licensing. See LICENSE.md.
pub mod rootset;
pub struct Flags {
pub json_output: bool,
pub base_path: String,
pub auth_token_path_override: Option<String>,
pub auth_token_override: Option<String>,
}

View file

@ -4,10 +4,11 @@ use std::io::Write;
use clap::ArgMatches;
use crate::{exitcode, Flags};
use super::Flags;
use zerotier_network_hypervisor::vl1::RootSet;
use zerotier_utils::exitcode;
use zerotier_utils::io::{read_limit, DEFAULT_FILE_IO_READ_LIMIT};
use zerotier_utils::json::to_json_pretty;
use zerotier_utils::marshalable::Marshalable;

7
service/src/lib.rs Normal file
View file

@ -0,0 +1,7 @@
pub mod cli;
pub mod cmdline_help;
pub mod localconfig;
pub mod sys;
pub mod utils;
pub mod vl1;
pub mod vnic;

View file

@ -6,7 +6,8 @@ use serde::{Deserialize, Serialize};
use zerotier_network_hypervisor::vl1::{Address, Endpoint};
use zerotier_network_hypervisor::vl2::NetworkId;
use zerotier_vl1_service::VL1Settings;
use crate::vl1::VL1Settings;
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(default)]

View file

@ -1,11 +1,5 @@
// (c) 2020-2022 ZeroTier, Inc. -- currently proprietary pending actual release and licensing. See LICENSE.md.
pub mod cli;
pub mod cmdline_help;
pub mod localconfig;
pub mod utils;
pub mod vnic;
use std::io::Write;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
@ -18,13 +12,17 @@ use clap::{Arg, ArgMatches, Command};
use zerotier_network_hypervisor::vl1::InnerProtocolLayer;
use zerotier_network_hypervisor::{VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION};
use zerotier_utils::exitcode;
use zerotier_vl1_service::datadir::DataDir;
use zerotier_vl1_service::VL1Service;
use crate::localconfig::Config;
use zerotier_service::cli;
use zerotier_service::cli::Flags;
use zerotier_service::cmdline_help;
use zerotier_service::localconfig::Config;
use zerotier_service::utils;
use zerotier_service::vl1::datadir::DataDir;
use zerotier_service::vl1::{VL1Service, VL1Settings};
pub fn print_help() {
let h = crate::cmdline_help::make_cmdline_help();
let h = cmdline_help::make_cmdline_help();
let _ = std::io::stdout().write_all(h.as_bytes());
}
@ -38,13 +36,6 @@ pub fn platform_default_home_path() -> String {
"/var/lib/zerotier".into()
}
pub struct Flags {
pub json_output: bool,
pub base_path: String,
pub auth_token_path_override: Option<String>,
pub auth_token_override: Option<String>,
}
fn open_datadir(flags: &Flags) -> Arc<DataDir<Config>> {
let datadir = DataDir::open(flags.base_path.as_str());
if datadir.is_ok() {
@ -212,7 +203,7 @@ fn main() {
eprintln!("FATAL: error generator or writing identity: {}", e.to_string());
exitcode::ERR_IOERR
} else {
let svc = VL1Service::new(id.unwrap(), test_inner, zerotier_vl1_service::VL1Settings::default());
let svc = VL1Service::new(id.unwrap(), test_inner, VL1Settings::default());
if svc.is_ok() {
let svc = svc.unwrap();
svc.node.init_default_roots();

View file

@ -5,7 +5,7 @@ use std::ptr::{copy_nonoverlapping, null_mut};
use zerotier_network_hypervisor::vl1::InetAddress;
use crate::localinterface::LocalInterface;
use crate::vl1::LocalInterface;
#[allow(unused)]
#[inline(always)]

View file

@ -10,7 +10,7 @@ use std::ptr::{null, null_mut};
use std::sync::atomic::{AtomicBool, AtomicI64, Ordering};
use std::sync::{Arc, RwLock};
use crate::localinterface::LocalInterface;
use crate::vl1::LocalInterface;
#[allow(unused_imports)]
use num_traits::AsPrimitive;

View file

@ -21,6 +21,7 @@ pub const CONFIG_FILENAME: &'static str = "local.conf";
const AUTH_TOKEN_DEFAULT_LENGTH: usize = 48;
const AUTH_TOKEN_POSSIBLE_CHARS: &'static str = "0123456789abcdefghijklmnopqrstuvwxyz";
/// ZeroTier home directory interface
pub struct DataDir<Config: PartialEq + Eq + Clone + Send + Sync + Default + Serialize + DeserializeOwned + 'static> {
pub base_path: PathBuf,
config: RwLock<Arc<Config>>,

View file

@ -5,9 +5,7 @@ mod localsocket;
mod vl1service;
mod vl1settings;
pub mod constants;
pub mod datadir;
pub mod sys;
pub use localinterface::LocalInterface;
pub use localsocket::LocalSocket;

View file

@ -12,10 +12,8 @@ use zerotier_network_hypervisor::vl1::identity::IdentitySecret;
use zerotier_network_hypervisor::vl1::*;
use zerotier_utils::{ms_monotonic, ms_since_epoch};
use crate::constants::UNASSIGNED_PRIVILEGED_PORTS;
use super::vl1settings::{VL1Settings, UNASSIGNED_PRIVILEGED_PORTS};
use crate::sys::udp::{udp_test_bind, BoundUdpPort, UdpPacketHandler};
use crate::vl1settings::VL1Settings;
use crate::LocalSocket;
/// Update UDP bindings every this many seconds.
const UPDATE_UDP_BINDINGS_EVERY_SECS: usize = 10;
@ -180,7 +178,7 @@ impl<Inner: InnerProtocolLayer + 'static> UdpPacketHandler for VL1Service<Inner>
self.as_ref(),
self.inner.as_ref(),
&Endpoint::IpUdp(source_address.clone()),
&LocalSocket::new(socket),
&super::localsocket::LocalSocket::new(socket),
&socket.interface,
time_ticks,
packet,
@ -189,8 +187,8 @@ impl<Inner: InnerProtocolLayer + 'static> UdpPacketHandler for VL1Service<Inner>
}
impl<Inner: InnerProtocolLayer + 'static> ApplicationLayer for VL1Service<Inner> {
type LocalSocket = crate::LocalSocket;
type LocalInterface = crate::LocalInterface;
type LocalSocket = super::localsocket::LocalSocket;
type LocalInterface = super::localinterface::LocalInterface;
#[inline]
fn event(&self, event: Event) {

View file

@ -1,5 +1,53 @@
// (c) 2020-2022 ZeroTier, Inc. -- currently proprietary pending actual release and licensing. See LICENSE.md.
use std::collections::HashSet;
use serde::{Deserialize, Serialize};
use zerotier_network_hypervisor::vl1::InetAddress;
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(default)]
pub struct VL1Settings {
/// Primary ZeroTier port that is always bound, default is 9993.
pub fixed_ports: HashSet<u16>,
/// Number of additional random ports to bind.
pub random_port_count: usize,
/// Enable uPnP, NAT-PMP, and other router port mapping technologies?
pub port_mapping: bool,
/// Interface name prefix blacklist for local bindings (not remote IPs).
pub interface_prefix_blacklist: HashSet<String>,
/// IP/bits CIDR blacklist for local bindings (not remote IPs).
pub cidr_blacklist: HashSet<InetAddress>,
}
impl VL1Settings {
#[cfg(target_os = "macos")]
pub const DEFAULT_PREFIX_BLACKLIST: [&'static str; 11] = ["lo", "utun", "gif", "stf", "iptap", "pktap", "feth", "zt", "llw", "anpi", "bridge"];
#[cfg(target_os = "linux")]
pub const DEFAULT_PREFIX_BLACKLIST: [&'static str; 5] = ["lo", "tun", "tap", "ipsec", "zt"];
#[cfg(windows)]
pub const DEFAULT_PREFIX_BLACKLIST: [&'static str; 0] = [];
}
impl Default for VL1Settings {
fn default() -> Self {
Self {
fixed_ports: HashSet::from([9993u16]),
random_port_count: 5,
port_mapping: true,
interface_prefix_blacklist: Self::DEFAULT_PREFIX_BLACKLIST.iter().map(|s| s.to_string()).collect(),
cidr_blacklist: HashSet::new(),
}
}
}
/// A list of unassigned or obsolete ports under 1024 that could possibly be squatted.
pub const UNASSIGNED_PRIVILEGED_PORTS: [u16; 299] = [
4, 6, 8, 10, 12, 14, 15, 16, 26, 28, 30, 32, 34, 36, 40, 60, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 285, 288, 289, 290, 291, 292,

View file

@ -1,20 +0,0 @@
[package]
name = "zerotier-vl1-service"
version = "0.1.0"
authors = ["ZeroTier, Inc. <contact@zerotier.com>", "Adam Ierymenko <adam.ierymenko@zerotier.com>"]
edition = "2021"
license = "MPL-2.0"
[dependencies]
zerotier-network-hypervisor = { path = "../network-hypervisor" }
zerotier-crypto = { path = "../crypto" }
zerotier-utils = { path = "../utils" }
num-traits = "^0"
serde = { version = "^1", features = ["derive"], default-features = false }
serde_json = { version = "^1", features = ["std"], default-features = false }
[target."cfg(windows)".dependencies]
winapi = { version = "^0", features = ["handleapi", "ws2ipdef", "ws2tcpip"] }
[target."cfg(not(windows))".dependencies]
libc = "^0"

View file

@ -1 +0,0 @@
../rustfmt.toml

View file

@ -1,49 +0,0 @@
// (c) 2020-2022 ZeroTier, Inc. -- currently proprietary pending actual release and licensing. See LICENSE.md.
use std::collections::HashSet;
use serde::{Deserialize, Serialize};
use zerotier_network_hypervisor::vl1::InetAddress;
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(default)]
pub struct VL1Settings {
/// Primary ZeroTier port that is always bound, default is 9993.
pub fixed_ports: HashSet<u16>,
/// Number of additional random ports to bind.
pub random_port_count: usize,
/// Enable uPnP, NAT-PMP, and other router port mapping technologies?
pub port_mapping: bool,
/// Interface name prefix blacklist for local bindings (not remote IPs).
pub interface_prefix_blacklist: HashSet<String>,
/// IP/bits CIDR blacklist for local bindings (not remote IPs).
pub cidr_blacklist: HashSet<InetAddress>,
}
impl VL1Settings {
#[cfg(target_os = "macos")]
pub const DEFAULT_PREFIX_BLACKLIST: [&'static str; 11] = ["lo", "utun", "gif", "stf", "iptap", "pktap", "feth", "zt", "llw", "anpi", "bridge"];
#[cfg(target_os = "linux")]
pub const DEFAULT_PREFIX_BLACKLIST: [&'static str; 5] = ["lo", "tun", "tap", "ipsec", "zt"];
#[cfg(windows)]
pub const DEFAULT_PREFIX_BLACKLIST: [&'static str; 0] = [];
}
impl Default for VL1Settings {
fn default() -> Self {
Self {
fixed_ports: HashSet::from([9993u16]),
random_port_count: 5,
port_mapping: true,
interface_prefix_blacklist: Self::DEFAULT_PREFIX_BLACKLIST.iter().map(|s| s.to_string()).collect(),
cidr_blacklist: HashSet::new(),
}
}
}