Source code for netbird.cloud

"""
Cloud-only resources namespace for NetBird API.

Provides access to cloud-only features via client.cloud.
"""

import warnings
from typing import TYPE_CHECKING, Optional

CLOUD_HOSTS = {"api.netbird.io", "app.netbird.io"}

if TYPE_CHECKING:
    from .client import APIClient
    from .resources.cloud.edr_falcon import EDRFalconResource
    from .resources.cloud.edr_huntress import EDRHuntressResource
    from .resources.cloud.edr_intune import EDRIntuneResource
    from .resources.cloud.edr_peers import EDRPeersResource
    from .resources.cloud.edr_sentinelone import EDRSentinelOneResource
    from .resources.cloud.event_streaming import EventStreamingResource
    from .resources.cloud.idp_scim import IDPScimResource
    from .resources.cloud.ingress import IngressResource
    from .resources.cloud.invoice import InvoiceResource
    from .resources.cloud.msp import MSPResource
    from .resources.cloud.services import ServicesResource
    from .resources.cloud.usage import UsageResource


[docs] class EDRResources: """Namespace for EDR (Endpoint Detection & Response) resources."""
[docs] def __init__(self, client: "APIClient") -> None: self.client = client self._peers: Optional["EDRPeersResource"] = None self._falcon: Optional["EDRFalconResource"] = None self._huntress: Optional["EDRHuntressResource"] = None self._intune: Optional["EDRIntuneResource"] = None self._sentinelone: Optional["EDRSentinelOneResource"] = None
@property def peers(self) -> "EDRPeersResource": """Access to EDR peer bypass endpoints.""" if self._peers is None: from .resources.cloud.edr_peers import EDRPeersResource self._peers = EDRPeersResource(self.client) return self._peers @property def falcon(self) -> "EDRFalconResource": """Access to CrowdStrike Falcon EDR integration.""" if self._falcon is None: from .resources.cloud.edr_falcon import EDRFalconResource self._falcon = EDRFalconResource(self.client) return self._falcon @property def huntress(self) -> "EDRHuntressResource": """Access to Huntress EDR integration.""" if self._huntress is None: from .resources.cloud.edr_huntress import EDRHuntressResource self._huntress = EDRHuntressResource(self.client) return self._huntress @property def intune(self) -> "EDRIntuneResource": """Access to Microsoft Intune EDR integration.""" if self._intune is None: from .resources.cloud.edr_intune import EDRIntuneResource self._intune = EDRIntuneResource(self.client) return self._intune @property def sentinelone(self) -> "EDRSentinelOneResource": """Access to SentinelOne EDR integration.""" if self._sentinelone is None: from .resources.cloud.edr_sentinelone import EDRSentinelOneResource self._sentinelone = EDRSentinelOneResource(self.client) return self._sentinelone
[docs] class CloudResources: """Namespace for cloud-only NetBird API resources. Access via client.cloud. """
[docs] def __init__(self, client: "APIClient") -> None: self.client = client host = getattr(client, "host", "") host = host.removeprefix("https://").removeprefix("http://") if host and host not in CLOUD_HOSTS: warnings.warn( f"Cloud endpoints are only available on NetBird Cloud " f"(api.netbird.io). Your host '{client.host}' appears to be " f"self-hosted. Cloud API calls may return 404 errors.", stacklevel=2, ) self._services: Optional["ServicesResource"] = None self._ingress: Optional["IngressResource"] = None self._edr: Optional["EDRResources"] = None self._msp: Optional["MSPResource"] = None self._invoices: Optional["InvoiceResource"] = None self._usage: Optional["UsageResource"] = None self._event_streaming: Optional["EventStreamingResource"] = None self._idp_scim: Optional["IDPScimResource"] = None
@property def services(self) -> "ServicesResource": """Access to reverse proxy services endpoints.""" if self._services is None: from .resources.cloud.services import ServicesResource self._services = ServicesResource(self.client) return self._services @property def ingress(self) -> "IngressResource": """Access to ingress ports endpoints.""" if self._ingress is None: from .resources.cloud.ingress import IngressResource self._ingress = IngressResource(self.client) return self._ingress @property def edr(self) -> "EDRResources": """Access to EDR integration endpoints.""" if self._edr is None: self._edr = EDRResources(self.client) return self._edr @property def msp(self) -> "MSPResource": """Access to MSP tenant management endpoints.""" if self._msp is None: from .resources.cloud.msp import MSPResource self._msp = MSPResource(self.client) return self._msp @property def invoices(self) -> "InvoiceResource": """Access to billing invoice endpoints.""" if self._invoices is None: from .resources.cloud.invoice import InvoiceResource self._invoices = InvoiceResource(self.client) return self._invoices @property def usage(self) -> "UsageResource": """Access to billing usage endpoints.""" if self._usage is None: from .resources.cloud.usage import UsageResource self._usage = UsageResource(self.client) return self._usage @property def event_streaming(self) -> "EventStreamingResource": """Access to event streaming integration endpoints.""" if self._event_streaming is None: from .resources.cloud.event_streaming import EventStreamingResource self._event_streaming = EventStreamingResource(self.client) return self._event_streaming @property def idp_scim(self) -> "IDPScimResource": """Access to IDP/SCIM integration endpoints.""" if self._idp_scim is None: from .resources.cloud.idp_scim import IDPScimResource self._idp_scim = IDPScimResource(self.client) return self._idp_scim