Commit Graph
14 Commits
Author SHA1 Message Date
Claude c5d3383abe Bridge Base Software gaps via OPNsense API
- Add POST /api/vlan/provision: end-to-end VLAN wizard that creates the
  switch VLAN, OPNsense VLAN tag, DHCP scope, and allow-outbound firewall
  rule in one call; returns pending_steps for anything needing manual
  OPNsense UI finish (interface assignment when opnsense_if not provided)

- Rewire POST /api/devices/push-reservation to target OPNsense DHCP when
  configured (no Advanced License required); falls back to switch CLI only
  if OPNsense is not set up; uses stored VLAN→interface map for iface lookup

- Rewrite POST /api/devices/push-pinhole to use OPNsense firewall/filter
  API instead of switch ACLs; stores rule UUIDs in pinholes.json for clean
  removal; no longer requires Advanced License

- Remove dead relay endpoints (GET/POST /api/dhcp/relay/*), RelayConfig
  model, and helpers (_get_relay_status, _get_vlan_ips, _build_relay_cmds);
  relay config is irrelevant when OPNsense is the DHCP server

- Add VLAN_IF_MAP_FILE and PINHOLE_FILE with load/save helpers to persist
  the VLAN→OPNsense interface mapping and pinhole rule UUIDs across restarts

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-24 14:27:21 +00:00
Claude 3f05be1f1d Add GET /api/switch/capabilities endpoint with license detection
Probes the switch using read-only show commands to detect whether the
Advanced Software License is installed. Base Software rejects ACL and
L3 VLAN interface commands with 'Invalid input detected'.

- GET /api/switch/capabilities: non-destructive probe (show ip access-list,
  show interface vlan 1), returns acl/l3_vlan/dhcp_relay_config/
  management_pinholes/dns_enforce_acls flags and license_tier. Cached 5 min.
- _require_advanced_license(): guard helper that raises HTTP 402 with a
  clear message before attempting any ACL push to the switch.
- Applied guard to: POST /api/switch/acl, /api/devices/push-pinhole,
  /api/dhcp/relay/configure, /api/ctrld/dns-enforce-acls.

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-24 14:02:06 +00:00
Claude e2e03b1459 Fix DHCP server commands to use correct 'show ip dhcp-server' syntax
The original commands were missing the 'ip' prefix. Correct ACLI syntax:
  show dhcp-server          -> show ip dhcp-server
  show dhcp-server leases   -> show ip dhcp-server leases
  show dhcp-server static-binding -> show ip dhcp-server static-binding

The ERS 59100GTS-PWR+ has a DHCP server but it may need to be enabled
first ('ip dhcp-server enable' in config mode) or may require an
Advanced License. All DHCP server calls now have try/except so device
discovery falls back to ARP if the feature is not yet active.

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-24 13:26:34 +00:00
Claude 82574ea0fa Fix CLI commands to match ERS 59100GTS-PWR+ actual ACLI syntax
- show ip route default → show ip route (parse 0.0.0.0 row for gateway)
- show ip helper-address → show ip dhcp-relay fwd-path + update parser
- ip helper-address → ip dhcp-relay fwd-path <vlan-ip> <server-ip>
  (add _get_vlan_ips() to resolve VLAN interface IPs before building cmds)
- Remove all show dhcp-server / show dhcp-server leases / show dhcp-server
  static-binding calls — switch has no DHCP server (show ip dhcp ? only
  shows 'client'). Device discovery now uses show arp only.
- push-reservation, sync to_switch/remove_switch → 501 Not Implemented
- _get_switch_reservations() / _get_switch_dhcp_status() return empty/false

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-24 13:22:01 +00:00
Claude c4001b0465 Fix read_cmd to use interactive shell with enable mode
exec_command runs in user mode on BOSS v7.9.6; most show commands
(show vlan, show sys-info, show poe-main-status, show config, etc.)
require enable mode. Switch to invoke_shell per read command, sending
terminal length 0 and enable before each command.

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-24 03:42:27 +00:00
Claude b43eed0546 Use show poe-main-status instead of per-port PoE command
show poe-port status rejects all argument formats on this firmware;
show poe-main-status gives overall PoE power and health data instead.

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-24 03:35:56 +00:00
Claude ea6203f5e6 Fix interface naming and save command for BOSS v7.9.6
- Use FastEthernet {p} instead of GigabitEthernet {p} for interface commands
- Use save config instead of copy running-config nvram:config.cfg

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-24 03:31:26 +00:00
Claude 639f1ea16f Fix SSH commands for BOSS v7.9.6 on ERS 59100GTS-PWR+
- Replace show poe-port-status with show poe-port status ALL
- Replace show vlan members with show vlan
- Replace show running-config with show config
- Fix VLAN port format from 1/{p} to {p} (BOSS uses bare port numbers)
- Fix interface naming from GigabitEthernet 1/{p} to GigabitEthernet {p}
- Add terminal length 0 to push session setup to prevent pagination

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-24 03:29:16 +00:00
Claude 12646d4184 Update switch_backend.py for ERS 59100GTS-PWR+ (96+4 port)
Replace ERS 5952 (48+4 port) config with ERS 59100GTS-PWR+:
- Port validation extended to 1–100
- All interfaces now use GigabitEthernet 1/{p} slot notation
- PoE boundary moved from port 48 to port 96
- VLAN commands updated to use 1/{p} port notation
- Key path, TOTP name, and app title updated

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-24 03:05:44 +00:00
Claude 2ebdb22e0a Add VoIP/SIP ACL template for Asterisk PBX, port range support
ACL backend:
- AclRule gains optional port_end field; build_acl generates
  "range X Y" when both port and port_end are set (needed for RTP)

New ACL template — "SIP Phone VLAN — Asterisk / FreePBX access":
- Permits SIP signaling UDP/TCP 5060 to PBX IP
- Permits SIP/TLS TCP 5061 to PBX IP
- Permits RTP audio UDP range 10000-20000 to PBX IP (uses new range syntax)
- Blocks management VLAN 99
- Permits internet and all other traffic
- Requires entering the Asterisk server IP (restricts SIP/RTP to that
  exact host, not the whole VLAN subnet)

Template description explains:
- Why OPNsense firewall rules are also needed (inter-VLAN routing)
- Exactly which OPNsense rules to add (including return RTP)
- Remote access options: WebRTC via Caddy reverse proxy (recommended)
  and SIP/TLS with fail2ban for traditional SIP clients

Template modal:
- New pbxIp param field shown for VoIP template
- Description box scrollable for longer template descriptions
- Preview renders "range X Y" for port range rules

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-23 16:15:38 +00:00
Claude f9bb4b26cc Add OPNsense WireGuard — router-level VPN with per-VLAN access control
Moves WireGuard off the management computer and onto OPNsense so any
device can VPN home without touching the management PC. Each peer is
restricted to only the VLANs you select (e.g. phone gets VLAN 10 only,
laptop gets VLAN 10 + 20). Private keys are generated on the mgmt PC
and never sent to OPNsense — only the public key is registered.

Backend (switch_backend.py):
- /api/opnsense/wireguard/status      — check plugin, server, peers
- /api/opnsense/wireguard/setup-server — create wg1 on OPNsense via API
- DELETE /api/opnsense/wireguard/server — tear down server
- /api/opnsense/wireguard/add-peer    — generate keypair, register peer,
                                        link to server, return .conf
- DELETE /api/opnsense/wireguard/peer/{uuid} — revoke peer
- /api/opnsense/wireguard/peer-config/{name} — fetch saved .conf

Frontend (ers5952-manager.jsx):
- New OPNsenseWGSection component added to VPN tab below local WireGuard
- Progressive UI: not configured → plugin missing → server setup →
  peer management (VLAN checkboxes) → QR/.conf download
- Firewall rules guidance panel auto-generated from active peers showing
  exactly which OPNsense rules to add per VLAN
- vlans prop threaded through to WireGuardTab so VLAN names/colors
  appear on peer badges and in the VLAN selector

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-23 15:31:53 +00:00
Claude 8b4ed7f331 Add DHCP relay config — all VLANs except 99 relay to OPNsense
- Backend: _get_relay_status() reads current ip helper-address per VLAN
- Backend: _build_relay_cmds() generates ERS 5952 relay CLI commands
- Backend: /api/dhcp/relay/status and /api/dhcp/relay/configure endpoints
- Backend: dhcp_overview now includes relay status in response
- Frontend: VLAN_MAP + VlanBadge + vlanFromIp() helpers for consistent labelling
- Frontend: RelayPanel shows per-VLAN relay status grid with push button;
  VLAN 99 always shown as locked/local, VLANs 10/20/30/40/50 show live
  relay target and purpose note
- Frontend: Reservations table gains VLAN column and inline purpose note
  (from descr/notes or VLAN_MAP fallback)

VLAN 99 is excluded from relay at both backend and UI level — it is the
switch management / OPNsense recovery path.

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-23 15:04:51 +00:00
Claude 360fbb5606 Add DNS enforcement, ACL templates, local hostnames, ctrld format fix
Features added:
- Port 53 conflict resolution: auto-detect/fix systemd-resolved stub listener
  on Linux; instructions for OPNsense Unbound (ctrld auto-terminates it)
- DNS enforcement ACLs: generate ERS 5952 ACL commands that permit DNS only
  to ctrld IP and block all other port 53/853 traffic per VLAN
- Inter-VLAN routing ACL templates: Staff, IoT, Guest, Camera profiles with
  live preview and parameter inputs (ctrld IP, NVR IP, subnet)
- Local hostname resolution: dnsmasq Docker service for .lan split-horizon DNS;
  manage hostname→IP mappings via UI; generates dnsmasq.conf and ctrld.toml
  upstream.local block
- Fix ctrld.toml format: correct [listener.0], [network.N], [upstream.N] table
  notation (was using wrong [[array]] notation); matches official docs format
- Backend docstrings: added docstrings to all previously undocumented functions
- README: new sections for port 53 conflict resolution, DNS enforcement ACLs,
  ACL templates, and local hostname resolution (dnsmasq)
- Fix Python 3.11 f-string syntax errors in Avaya_5952_setup.py (backslash
  in f-string expressions, same-type quote in dict access); embed now succeeds

https://claude.ai/code/session_01JR2EMK7rwrZJowpstcaxQ6
2026-03-23 13:16:59 +00:00
Outis 81f6afd697 Add files via upload 2026-03-23 08:52:01 -04:00