feat: add zerotier to network cli

This commit is contained in:
Moritz Böhme
2025-09-01 12:43:40 +02:00
committed by Qubasa
parent 559c13f41b
commit 3d8fab062d
3 changed files with 61 additions and 1 deletions

2
.gitignore vendored
View File

@@ -52,3 +52,5 @@ pkgs/clan-app/ui/.fonts
*.gif
*.mp4
*.mkv
.jj

View File

@@ -8,8 +8,25 @@
roles.peer = {
perInstance =
{ instanceName, roles, ... }:
{
instanceName,
roles,
lib,
...
}:
{
exports.networking = {
priority = lib.mkDefault 20;
# TODO add user space network support to clan-cli
module = "clan_lib.network.zerotier";
peers = lib.mapAttrs (name: machine: {
host.var = {
machine = name;
generator = "zerotier";
file = "zerotier-ip";
};
}) roles.peer.machines;
};
nixosModule =
{
config,

View File

@@ -0,0 +1,41 @@
import logging
import time
from collections.abc import Iterator
from contextlib import contextmanager
from dataclasses import dataclass
from clan_lib.errors import ClanError
from clan_lib.network import Network, NetworkTechnologyBase, Peer
from clan_lib.ssh.remote import Remote
log = logging.getLogger(__name__)
@dataclass(frozen=True)
class NetworkTechnology(NetworkTechnologyBase):
def is_running(self) -> bool:
return True
def ping(self, remote: Remote) -> None | float:
if self.is_running():
try:
# Use the existing SSH reachability check
now = time.time()
remote.check_machine_ssh_reachable()
return (time.time() - now) * 1000
except ClanError as e:
log.debug(f"Error checking peer {remote}: {e}")
return None
return None
@contextmanager
def connection(self, network: Network) -> Iterator[Network]:
yield network
def remote(self, peer: Peer) -> "Remote":
return Remote(
address=peer.host,
command_prefix=peer.name,
)