feat(netbird): central control of client Automatic Updates across all customers
Lets the MSP admin control NetBird's own "Settings > Clients > Automatic Updates" feature (client/peer auto-update, v0.61.0+) for every customer from one place, instead of logging into each customer's dashboard individually. - New deployments automatically capture a Personal Access Token during the existing /api/setup bootstrap call (create_pat=true), requiring NB_SETUP_PAT_ENABLED=true on the management container (now set by default in the compose template). Token is encrypted at rest per customer. - Existing customers (deployed before this existed) can have a token pasted in manually from their own dashboard — verified before being stored. - Settings > Docker Images: master default (version + force-update toggle) plus "Apply to All Customers" which pushes it to everyone with a token. - Customer detail page: shows the customer's live current setting (read from their NetBird API, not cached) with per-customer override or "sync from default". - New app/services/netbird_client_update_service.py wraps the customer's NetBird Management API (GET/PUT /api/accounts) for this.
This commit is contained in:
@@ -162,6 +162,9 @@ class SystemConfigUpdate(BaseModel):
|
||||
auto_update_check_enabled: Optional[bool] = None
|
||||
auto_update_check_time: Optional[str] = Field(None, max_length=5)
|
||||
auto_update_apply_enabled: Optional[bool] = None
|
||||
# Master default for the NetBird client (peer) automatic-updates feature
|
||||
netbird_client_auto_update_version: Optional[str] = Field(None, max_length=50)
|
||||
netbird_client_auto_update_always: Optional[bool] = None
|
||||
|
||||
@field_validator("auto_update_check_time")
|
||||
@classmethod
|
||||
@@ -174,6 +177,27 @@ class SystemConfigUpdate(BaseModel):
|
||||
raise ValueError("auto_update_check_time must be in HH:MM 24h format")
|
||||
return v
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# NetBird client (peer) automatic updates
|
||||
# ---------------------------------------------------------------------------
|
||||
class NetbirdClientAutoUpdatePayload(BaseModel):
|
||||
"""Push a client auto-update version/mode to one or all customers."""
|
||||
|
||||
version: str = Field(..., max_length=50, description="'latest', 'disabled', or a version e.g. '0.61.0'")
|
||||
always: bool = False
|
||||
|
||||
|
||||
class NetbirdApiTokenPayload(BaseModel):
|
||||
"""Manually register a NetBird Personal Access Token for a customer.
|
||||
|
||||
Needed for customers deployed before automatic PAT capture existed —
|
||||
create a PAT once in that customer's own NetBird dashboard
|
||||
(Settings > Service Users / Personal Access Tokens) and paste it here.
|
||||
"""
|
||||
|
||||
token: str = Field(..., min_length=10, max_length=500)
|
||||
|
||||
@field_validator("ssl_mode")
|
||||
@classmethod
|
||||
def validate_ssl_mode(cls, v: Optional[str]) -> Optional[str]:
|
||||
|
||||
Reference in New Issue
Block a user