diff --git a/src/tailscale/models.py b/src/tailscale/models.py index b23a1a75..033efce5 100644 --- a/src/tailscale/models.py +++ b/src/tailscale/models.py @@ -22,6 +22,14 @@ class ClientSupports(DataClassORJSONMixin): upnp: bool | None +@dataclass +class Latency(DataClassORJSONMixin): + """Object holding Tailscale device information.""" + + latency_ms: float = field(metadata=field_options(alias="latencyMs")) + preferred: bool | None = None + + @dataclass class ClientConnectivity(DataClassORJSONMixin): """Object holding Tailscale device information.""" @@ -30,6 +38,7 @@ class ClientConnectivity(DataClassORJSONMixin): metadata=field_options(alias="clientSupports") ) endpoints: list[str] = field(default_factory=list) + latency: dict[str, Latency] = field(default_factory=dict) mapping_varies_by_dest_ip: bool | None = field( default=None, metadata=field_options(alias="mappingVariesByDestIP"), @@ -50,6 +59,9 @@ class Device(DataClassORJSONMixin): metadata=field_options(alias="clientConnectivity") ) client_version: str = field(metadata=field_options(alias="clientVersion")) + connected_to_control: bool = field( + metadata=field_options(alias="connectedToControl") + ) created: datetime | None device_id: str = field(metadata=field_options(alias="id")) expires: datetime | None @@ -60,7 +72,9 @@ class Device(DataClassORJSONMixin): machine_key: str = field(metadata=field_options(alias="machineKey")) name: str node_key: str = field(metadata=field_options(alias="nodeKey")) + node_id: str = field(metadata=field_options(alias="nodeId")) os: str + tailnet_lock_key: str = field(metadata=field_options(alias="tailnetLockKey")) update_available: bool = field(metadata=field_options(alias="updateAvailable")) user: str advertised_routes: list[str] = field( @@ -69,7 +83,23 @@ class Device(DataClassORJSONMixin): enabled_routes: list[str] = field( default_factory=list, metadata=field_options(alias="enabledRoutes") ) + is_ephemeral: bool | None = field( + default=None, + metadata=field_options(alias="isEphemeral"), + ) + multiple_connections: bool | None = field( + default=None, + metadata=field_options(alias="multipleConnections"), + ) + ssh_enabled: bool | None = field( + default=None, + metadata=field_options(alias="sshEnabled"), + ) tags: list[str] = field(default_factory=list) + tailnet_lock_error: str | None = field( + default=None, + metadata=field_options(alias="tailnetLockError"), + ) @classmethod def __pre_deserialize__(cls, d: dict[Any, Any]) -> dict[Any, Any]: @@ -87,6 +117,8 @@ def __pre_deserialize__(cls, d: dict[Any, Any]) -> dict[Any, Any]: # Convert an empty string to None. if not d.get("created"): d["created"] = None + if not d.get("tailnetLockError"): + d["tailnetLockError"] = None return d