mirror of
https://github.com/hansjone/netx.git
synced 2026-10-12 04:10:47 +08:00
feat(cli): UME lazy exec via shared profiles and ume_ne_id MCP support
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
ba1a40f725
commit
38a1c7f3a9
21 changed files with 1504 additions and 54 deletions
122
netx_api/cli_schemas.py
Normal file
122
netx_api/cli_schemas.py
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, Field, field_validator
|
||||
|
||||
from .device_types import SUPPORTED_VENDORS
|
||||
|
||||
|
||||
class CliConnectProfileCreate(BaseModel):
|
||||
name: str
|
||||
username: str
|
||||
password: str = ""
|
||||
port: int = 22
|
||||
protocol: str = "ssh"
|
||||
device_type_default: str = "zte_zxros"
|
||||
vendor_default: str = "ZTE"
|
||||
ne_type_rules: str = ""
|
||||
is_default: bool = False
|
||||
hop_enabled: bool = False
|
||||
hop_vendor: str = "zte"
|
||||
hop_host: str = ""
|
||||
hop_port: int = 22
|
||||
hop_protocol: str = "ssh"
|
||||
hop_username: str = ""
|
||||
hop_password: str = ""
|
||||
hop_command_template: str = ""
|
||||
hop_vrf: str = ""
|
||||
hop_target_auth_mode: str = "bastion_managed"
|
||||
|
||||
@field_validator("vendor_default")
|
||||
@classmethod
|
||||
def normalize_vendor(cls, v: str) -> str:
|
||||
raw = str(v or "").strip()
|
||||
if not raw:
|
||||
return "ZTE"
|
||||
for item in SUPPORTED_VENDORS:
|
||||
if item.lower() == raw.lower():
|
||||
return item
|
||||
return "Other"
|
||||
|
||||
|
||||
class CliConnectProfileUpdate(BaseModel):
|
||||
name: str | None = None
|
||||
username: str | None = None
|
||||
password: str | None = None
|
||||
port: int | None = None
|
||||
protocol: str | None = None
|
||||
device_type_default: str | None = None
|
||||
vendor_default: str | None = None
|
||||
ne_type_rules: str | None = None
|
||||
is_default: bool | None = None
|
||||
hop_enabled: bool | None = None
|
||||
hop_vendor: str | None = None
|
||||
hop_host: str | None = None
|
||||
hop_port: int | None = None
|
||||
hop_protocol: str | None = None
|
||||
hop_username: str | None = None
|
||||
hop_password: str | None = None
|
||||
hop_command_template: str | None = None
|
||||
hop_vrf: str | None = None
|
||||
hop_target_auth_mode: str | None = None
|
||||
|
||||
|
||||
class CliConnectProfileOut(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
is_default: bool
|
||||
username: str
|
||||
port: int
|
||||
protocol: str
|
||||
device_type_default: str
|
||||
vendor_default: str
|
||||
ne_type_rules: str
|
||||
hop_enabled: bool
|
||||
hop_vendor: str
|
||||
hop_host: str
|
||||
hop_port: int
|
||||
hop_protocol: str
|
||||
hop_username: str
|
||||
hop_command_template: str
|
||||
hop_vrf: str
|
||||
hop_target_auth_mode: str
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
|
||||
class UmeCliOverrideUpdate(BaseModel):
|
||||
profile_id: str | None = None
|
||||
username_override: str | None = None
|
||||
device_type_override: str | None = None
|
||||
vendor_override: str | None = None
|
||||
|
||||
|
||||
class UmeCliOverrideOut(BaseModel):
|
||||
ume_ne_id: str
|
||||
profile_id: str | None
|
||||
username_override: str
|
||||
device_type_override: str
|
||||
vendor_override: str
|
||||
connect_status: str
|
||||
connect_message: str
|
||||
connect_detail: str
|
||||
connect_tested_at: datetime | None
|
||||
updated_at: datetime
|
||||
|
||||
|
||||
class UmeConnectTestRequest(BaseModel):
|
||||
ume_ne_ids: list[str] = Field(min_length=1)
|
||||
|
||||
|
||||
class CliTargetOut(BaseModel):
|
||||
source: str
|
||||
id: str
|
||||
ume_ne_id: str | None = None
|
||||
name: str
|
||||
ip_address: str
|
||||
ne_type: str = ""
|
||||
vendor: str = ""
|
||||
device_type: str = ""
|
||||
connect_status: str = "unknown"
|
||||
cli_profile_ready: bool = False
|
||||
Loading…
Add table
Add a link
Reference in a new issue