netapi: Multi-Vendor Network CLI

Problem

Network engineers manage multiple vendor platforms daily:

  • Cisco ISE - 802.1X, guest portals, posture

  • pfSense - Firewalls, DNS, VPN

  • Cisco WLC - Wireless controllers

  • Cloudflare - DNS, Pages, Access

  • Keycloak - Identity federation

Each has its own API, authentication method, and CLI (or none at all).

Result: Context switching, credential sprawl, inconsistent automation.

Solution

netapi provides a unified CLI that speaks to all platforms with consistent patterns:

# Same pattern, different platforms
netapi ise sessions
netapi pfsense dns list
netapi wlc clients
netapi cloudflare zones
netapi keycloak users
netapi Architecture

Architecture

┌─────────────────────────────────────────────────────────────┐
│                        netapi CLI                           │
├─────────────────────────────────────────────────────────────┤
│  ise      │  pfsense  │  wlc      │ cloudflare │ keycloak  │
├───────────┴───────────┴───────────┴────────────┴───────────┤
│                    Core Framework                           │
│  • Credential Management (dsource integration)              │
│  • Output Formatting (table, json, csv)                     │
│  • Error Handling                                           │
│  • Shell Completions                                        │
├─────────────────────────────────────────────────────────────┤
│                    Platform Clients                         │
│  • REST API wrappers                                        │
│  • Authentication handling                                  │
│  • Response parsing                                         │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ ISE API  │ │ pfSense  │ │ WLC API  │ │Cloudflare│ │ Keycloak │
│ REST/ERS │ │ PHP API  │ │ REST     │ │ REST     │ │ REST     │
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘