add env example, fix bug with Callable object
This commit is contained in:
@@ -0,0 +1,47 @@
|
|||||||
|
# nexus-sync environment example
|
||||||
|
# Copy this file to .env and replace example secrets before running.
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Server configuration
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Comma-separated client_id:token pairs accepted by the server.
|
||||||
|
# Example with one client:
|
||||||
|
# NEXUS_SYNC_CLIENT_TOKENS="laptop:change-me-long-random-token"
|
||||||
|
# Example with multiple clients:
|
||||||
|
# NEXUS_SYNC_CLIENT_TOKENS="laptop:change-me-token-1,desktop:change-me-token-2"
|
||||||
|
#
|
||||||
|
# Current development default in code is dev-client:dev-token if unset, but it is
|
||||||
|
# better to set this explicitly.
|
||||||
|
NEXUS_SYNC_CLIENT_TOKENS="dev-client:dev-token"
|
||||||
|
|
||||||
|
# Logging level for both server and client: DEBUG, INFO, WARNING, ERROR, CRITICAL.
|
||||||
|
NEXUS_SYNC_LOG_LEVEL="INFO"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Client configuration
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Base URL of the nexus-sync server.
|
||||||
|
NEXUS_SYNC_SERVER_URL="http://127.0.0.1:8000"
|
||||||
|
|
||||||
|
# Stable ID of this machine/client. Must match one client_id from
|
||||||
|
# NEXUS_SYNC_CLIENT_TOKENS on the server.
|
||||||
|
NEXUS_SYNC_CLIENT_ID="dev-client"
|
||||||
|
|
||||||
|
# Bearer token for this client. Must match the token paired with
|
||||||
|
# NEXUS_SYNC_CLIENT_ID on the server.
|
||||||
|
NEXUS_SYNC_CLIENT_TOKEN="dev-token"
|
||||||
|
|
||||||
|
# Commands this client is allowed to execute when the server requests them.
|
||||||
|
# Supported presets currently implemented:
|
||||||
|
# - hostname
|
||||||
|
# - network_interfaces
|
||||||
|
#
|
||||||
|
# Safer explicit allowlist:
|
||||||
|
NEXUS_SYNC_ALLOWED_COMMANDS="hostname,network_interfaces"
|
||||||
|
|
||||||
|
# Alternative: allow every locally registered preset. This still does NOT allow
|
||||||
|
# arbitrary shell strings from the server. Uncomment instead of the line above if
|
||||||
|
# desired.
|
||||||
|
# NEXUS_SYNC_ALLOWED_COMMANDS="full_access"
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ import urllib.error
|
|||||||
import urllib.request
|
import urllib.request
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import UTC, datetime
|
from datetime import UTC, datetime
|
||||||
from typing import Callable, Mapping
|
from types import TracebackType
|
||||||
|
from typing import Callable, Mapping, Protocol, Self
|
||||||
|
|
||||||
from pydantic import ValidationError
|
from pydantic import ValidationError
|
||||||
|
|
||||||
@@ -38,6 +39,22 @@ class HeartbeatError(RuntimeError):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class HeartbeatHTTPResponse(Protocol):
|
||||||
|
def __enter__(self) -> Self: ...
|
||||||
|
|
||||||
|
def __exit__(
|
||||||
|
self,
|
||||||
|
exc_type: type[BaseException] | None,
|
||||||
|
exc: BaseException | None,
|
||||||
|
traceback: TracebackType | None,
|
||||||
|
) -> None: ...
|
||||||
|
|
||||||
|
def read(self) -> bytes: ...
|
||||||
|
|
||||||
|
|
||||||
|
HeartbeatOpener = Callable[[urllib.request.Request], HeartbeatHTTPResponse]
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class ClientConfig:
|
class ClientConfig:
|
||||||
server_url: str
|
server_url: str
|
||||||
@@ -84,7 +101,7 @@ def send_heartbeat(
|
|||||||
config: ClientConfig,
|
config: ClientConfig,
|
||||||
heartbeat: HeartbeatRequest,
|
heartbeat: HeartbeatRequest,
|
||||||
*,
|
*,
|
||||||
opener: Callable[[urllib.request.Request], object] = urllib.request.urlopen,
|
opener: HeartbeatOpener = urllib.request.urlopen,
|
||||||
) -> HeartbeatResponse:
|
) -> HeartbeatResponse:
|
||||||
payload = heartbeat.model_dump_json().encode()
|
payload = heartbeat.model_dump_json().encode()
|
||||||
request = urllib.request.Request(
|
request = urllib.request.Request(
|
||||||
|
|||||||
Reference in New Issue
Block a user