┌──────────────────────────────────────────────────────────────────────────────────┐
│ EXTERNAL LISTENER FLOW │
├──────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ╔════════════════════════════════════════════════════════════════════════════╗ │
│ ║ CREATE LISTENER ║ │
│ ╚════════════════════════════════════════════════════════════════════════════╝ │
│ │
│ GUI ──> POST /listener/create │
│ │ │
│ V │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ TEAMSERVER │ │
│ │ │ │ │
│ │ V │ │
│ │ TsListenerCreate(listenerType, name, config) │ │
│ │ │ │ │
│ │ V │ │
│ │ ┌───────────────────────────────────────────────────────────────────────┐ │ │
│ │ │ EXTENDER │ │ │
│ │ │ │ │ │ │
│ │ │ V │ │ │
│ │ │ PluginListener.Create(name, config, customData) │ │ │
│ │ │ │ │ │ │
│ │ │ ├──> Configuration validation │ │ │
│ │ │ └──> return ExtenderListener, ListenerData, customData │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ └──> Save to DBMS, broadcast to clients │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ╔════════════════════════════════════════════════════════════════════════════╗ │
│ ║ START LISTENER ║ │
│ ╚════════════════════════════════════════════════════════════════════════════╝ │
│ │
│ (automatically after Create) │
│ │ │
│ V │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ TEAMSERVER │ │
│ │ │ │ │
│ │ V │ │
│ │ TsListenerStart(listenerName) │ │
│ │ │ │ │
│ │ V │ │
│ │ ┌───────────────────────────────────────────────────────────────────────┐ │ │
│ │ │ EXTENDER │ │ │
│ │ │ │ │ │ │
│ │ │ V │ │ │
│ │ │ ExtenderListener.Start() │ │ │
│ │ │ │ │ │ │
│ │ │ └──> Start HTTP/DNS server │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ╔════════════════════════════════════════════════════════════════════════════╗ │
│ ║ AGENT CONNECTION ║ │
│ ╚════════════════════════════════════════════════════════════════════════════╝ │
│ │
│ Agent ──> [HTTP] Request to Listener │
│ │ │
│ V │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ EXTENDER ([HTTP] Handler) │ │
│ │ │ │ │
│ │ V │ │
│ │ [processRequest(ctx)] │ │
│ │ │ │ │
│ │ ├──> Extract AgentID and data │ │
│ │ │ │ │
│ │ V │ │
│ │ ┌───────────────────────────────────────────────────────────────────────┐ │ │
│ │ │ TEAMSERVER API calls │ │ │
│ │ │ │ │ │ │
│ │ │ ├──> if !TsAgentIsExists(agentId): │ │ │
│ │ │ │ TsAgentCreate(agentCrc, agentId, data, listener, IP) │ │ │
│ │ │ │ │ │ │
│ │ │ ├──> TsAgentSetTick(agentId, listener) - last tick update │ │ │
│ │ │ │ │ │ │
│ │ │ ├──> TsAgentProcessData(agentId, bodyData) - process data │ │ │
│ │ │ │ │ │ │
│ │ │ └──> TsAgentGetHostedAll(agentId, maxSize) - send tasks │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ └──> return [HTTP] response to agent │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ╔════════════════════════════════════════════════════════════════════════════╗ │
│ ║ STOP LISTENER ║ │
│ ╚════════════════════════════════════════════════════════════════════════════╝ │
│ │
│ GUI ──> POST /listener/stop │
│ │ │
│ V │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ TEAMSERVER │ │
│ │ │ │ │
│ │ V │ │
│ │ TsListenerStop(listenerName) │ │
│ │ │ │ │
│ │ V │ │
│ │ ┌───────────────────────────────────────────────────────────────────────┐ │ │
│ │ │ EXTENDER │ │ │
│ │ │ │ │ │ │
│ │ │ V │ │ │
│ │ │ ExtenderListener.Stop() │ │ │
│ │ │ │ │ │ │
│ │ │ └──> Stop server, cleanup resources │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────────┘