сонет вайб 2

This commit is contained in:
dv 2026-04-08 12:56:51 +03:00
parent 6c081d5580
commit 3460a7ccac

View file

@ -133,10 +133,10 @@ def _parse_config(config_text: str, rack_host: str, all_rack_hosts: list[str] |
logger.info(f"[ssh_discovery] Plugin '{plugin_name}' (cls={cls})") logger.info(f"[ssh_discovery] Plugin '{plugin_name}' (cls={cls})")
# Collect all URI-like values in this section # uri/frame_uri/host → actual device (camera, io_board, etc.)
uri_fields = ("uri", "frame_uri", "host") device_uri_fields = ("uri", "frame_uri", "host")
found_ip_in_plugin = False found_ip_in_plugin = False
for field_name in uri_fields: for field_name in device_uri_fields:
raw = parser.get(section, field_name, fallback=None) raw = parser.get(section, field_name, fallback=None)
if not raw: if not raw:
logger.info(f"[ssh_discovery] {field_name}: (not set)") logger.info(f"[ssh_discovery] {field_name}: (not set)")
@ -164,9 +164,42 @@ def _parse_config(config_text: str, rack_host: str, all_rack_hosts: list[str] |
)) ))
found_ip_in_plugin = True found_ip_in_plugin = True
# stream_uri → RTSP server (separate VM, not the camera itself)
stream_raw = parser.get(section, "stream_uri", fallback=None)
if stream_raw:
logger.info(f"[ssh_discovery] stream_uri='{stream_raw}'")
stream_ip = _extract_ip(stream_raw)
if stream_ip and stream_ip not in all_rack_hosts and stream_ip not in seen_ips:
seen_ips.add(stream_ip)
logger.info(f"[ssh_discovery] → EXTRACTED {stream_ip} as RTSP server (category=vm)")
discovered.append(DiscoveredDevice(
ip=stream_ip,
category="vm",
role="other",
plugin_name=f"{plugin_name}_rtsp",
cls="rtsp_server",
))
found_ip_in_plugin = True
if not found_ip_in_plugin: if not found_ip_in_plugin:
logger.info(f"[ssh_discovery] → No network devices found in this plugin") logger.info(f"[ssh_discovery] → No network devices found in this plugin")
# Parse [caps.voice] section for Asterisk server
voice_addr = parser.get("caps.voice", "server_addr", fallback=None)
if voice_addr:
logger.info(f"[ssh_discovery] [caps.voice] server_addr='{voice_addr}'")
voice_ip = _extract_ip(f"sip://{voice_addr}") or (voice_addr.strip() if re.match(r"^\d{1,3}(\.\d{1,3}){3}$", voice_addr.strip()) else None)
if voice_ip and voice_ip not in all_rack_hosts and voice_ip not in seen_ips:
seen_ips.add(voice_ip)
logger.info(f"[ssh_discovery] → EXTRACTED {voice_ip} as Asterisk (category=vm)")
discovered.append(DiscoveredDevice(
ip=voice_ip,
category="vm",
role="other",
plugin_name="asterisk",
cls="asterisk",
))
return discovered return discovered
@ -505,6 +538,59 @@ async def discover_via_ssh(
rack_id_mapping[ext_id] = new_rack.id rack_id_mapping[ext_id] = new_rack.id
logger.info(f"[ssh_discovery] Created rack entry '{ext_id}' (id={new_rack.id})") logger.info(f"[ssh_discovery] Created rack entry '{ext_id}' (id={new_rack.id})")
# Step 1b: Add main CAPS server and DB server as devices
infra_devices = []
if obj.server_ip:
infra_devices.append((obj.server_ip, "main_server", "caps_server"))
if obj.db_host and obj.db_host != obj.server_ip:
infra_devices.append((obj.db_host, "vm", "db_server"))
for infra_ip, infra_category, infra_hostname in infra_devices:
try:
existing_infra = (await db.execute(
select(Device).where(
Device.object_id == obj.id,
Device.ip == infra_ip,
)
)).scalar_one_or_none()
if existing_infra is None:
db.add(Device(
object_id=obj.id,
ip=infra_ip,
hostname=infra_hostname,
category=infra_category,
role="other",
source="auto_ssh",
location="server_room",
))
logger.info(f"[ssh_discovery] {infra_ip} ({infra_hostname}) - ADDED: category={infra_category}, location=server_room, source=auto_ssh")
result.created += 1
result.actions.append(DeviceAction(
ip=infra_ip,
hostname=infra_hostname,
action="ADDED",
reason=f"object infrastructure device ({infra_category})",
category=infra_category,
role="other",
))
else:
logger.info(f"[ssh_discovery] {infra_ip} ({infra_hostname}) - SKIPPED: already exists (category={existing_infra.category}, hostname={existing_infra.hostname})")
result.skipped += 1
result.actions.append(DeviceAction(
ip=infra_ip,
hostname=existing_infra.hostname or infra_hostname,
action="SKIPPED",
reason=f"already exists (category={existing_infra.category})",
category=existing_infra.category,
role=existing_infra.role,
))
except Exception as exc:
logger.error(f"[ssh_discovery] {infra_ip} ({infra_hostname}) - ERROR: {exc}")
result.errors.append(f"Error upserting infra device {infra_ip}: {exc}")
if infra_devices:
await db.flush()
for external_id, rack_host, rack_name in rack_hosts: for external_id, rack_host, rack_name in rack_hosts:
# Resolve config_path override from the embedded device's connection_params # Resolve config_path override from the embedded device's connection_params
existing_rack_pc = (await db.execute( existing_rack_pc = (await db.execute(
@ -552,6 +638,7 @@ async def discover_via_ssh(
category="embedded", category="embedded",
role="other", role="other",
source="auto_ssh", source="auto_ssh",
rack_id=rack_id_mapping.get(external_id),
)) ))
logger.info(f"[ssh_discovery] {rack_host} ({rack_hostname}) - ADDED: category=main_server, role=other, hostname={rack_hostname}, source=auto_ssh") logger.info(f"[ssh_discovery] {rack_host} ({rack_hostname}) - ADDED: category=main_server, role=other, hostname={rack_hostname}, source=auto_ssh")
result.created += 1 result.created += 1
@ -563,6 +650,22 @@ async def discover_via_ssh(
category="embedded", category="embedded",
role="other", role="other",
)) ))
else:
rack_changes = []
if existing_rack.rack_id is None and rack_id_mapping.get(external_id) is not None:
existing_rack.rack_id = rack_id_mapping[external_id]
rack_changes.append(f"rack_id: None→{existing_rack.rack_id}")
if rack_changes:
logger.info(f"[ssh_discovery] {rack_host} ({existing_rack.hostname}) - UPDATED: {', '.join(rack_changes)}")
result.updated += 1
result.actions.append(DeviceAction(
ip=rack_host,
hostname=existing_rack.hostname,
action="UPDATED",
reason="; ".join(rack_changes),
category=existing_rack.category,
role=existing_rack.role,
))
else: else:
logger.info(f"[ssh_discovery] {rack_host} ({existing_rack.hostname}) - SKIPPED: rack already exists in devices") logger.info(f"[ssh_discovery] {rack_host} ({existing_rack.hostname}) - SKIPPED: rack already exists in devices")
result.skipped += 1 result.skipped += 1