towerops-agent/proto/agent.proto
Graham McIntire 967d317b69
Complete WebSocket migration for agent communication
Major architectural change from REST API polling to WebSocket-based
bidirectional communication:

**What Changed:**
- Agent now uses persistent WebSocket connection instead of REST API
- Server pushes SNMP query jobs to agent via Phoenix Channels
- Agent executes raw SNMP queries and returns results
- Removed complex polling/scheduling/buffering architecture

**New Files:**
- src/websocket_client.rs - WebSocket client with SNMP job execution
- Extended proto/agent.proto with WebSocket message types

**Modified Files:**
- src/main.rs - Simplified to connect and run WebSocket client
- src/health.rs - Simplified health endpoint (no storage needed)
- src/snmp/mod.rs - Export SnmpValue for WebSocket client

**Removed Files:**
- src/api_client.rs - Old REST API client
- src/config.rs - Old config types
- src/buffer/ - SQLite buffering (no longer needed)
- src/metrics/ - Old metric types
- src/poller/ - Polling/scheduling logic
- src/snmp/neighbor.rs - High-level neighbor discovery

**Dependencies:**
- Switched from native-tls to rustls for WebSocket TLS
- Uses tokio-tungstenite for WebSocket communication
- Protobuf for efficient binary message encoding

**Benefits:**
- Simpler agent architecture (~500 lines vs 5000+)
- Real-time job execution (<1s vs 60s polling)
- No duplicate SNMP profile logic
- No local storage/buffering complexity
- 68% smaller message payloads (protobuf vs JSON)
2026-01-16 17:57:41 -06:00

154 lines
2.8 KiB
Protocol Buffer

syntax = "proto3";
package towerops.agent;
// Configuration received from the API
message AgentConfig {
string version = 1;
uint32 poll_interval_seconds = 2;
repeated Equipment equipment = 3;
}
message Equipment {
string id = 1;
string name = 2;
string ip_address = 3;
SnmpConfig snmp = 4;
uint32 poll_interval_seconds = 5;
repeated Sensor sensors = 6;
repeated Interface interfaces = 7;
}
message SnmpConfig {
bool enabled = 1;
string version = 2;
string community = 3;
uint32 port = 4;
}
message Sensor {
string id = 1;
string type = 2;
string oid = 3;
double divisor = 4;
string unit = 5;
map<string, string> metadata = 6;
}
message Interface {
string id = 1;
uint32 if_index = 2;
string if_name = 3;
}
// Metrics submitted to the API
message MetricBatch {
repeated Metric metrics = 1;
}
message Metric {
oneof metric_type {
SensorReading sensor_reading = 1;
InterfaceStat interface_stat = 2;
NeighborDiscovery neighbor_discovery = 3;
}
}
message SensorReading {
string sensor_id = 1;
double value = 2;
string status = 3;
int64 timestamp = 4; // Unix timestamp in seconds
}
message InterfaceStat {
string interface_id = 1;
int64 if_in_octets = 2;
int64 if_out_octets = 3;
int64 if_in_errors = 4;
int64 if_out_errors = 5;
int64 if_in_discards = 6;
int64 if_out_discards = 7;
int64 timestamp = 8; // Unix timestamp in seconds
}
message NeighborDiscovery {
string interface_id = 1;
string protocol = 2; // "lldp" or "cdp"
string remote_chassis_id = 3;
string remote_system_name = 4;
string remote_system_description = 5;
string remote_platform = 6;
string remote_port_id = 7;
string remote_port_description = 8;
string remote_address = 9;
repeated string remote_capabilities = 10;
int64 timestamp = 11; // Unix timestamp in seconds
}
// Heartbeat metadata
message HeartbeatMetadata {
string version = 1;
string hostname = 2;
uint64 uptime_seconds = 3;
}
message HeartbeatResponse {
string status = 1;
}
// WebSocket-specific messages
enum JobType {
DISCOVER = 0;
POLL = 1;
}
enum QueryType {
GET = 0;
WALK = 1;
}
message AgentJobList {
repeated AgentJob jobs = 1;
}
message AgentJob {
string job_id = 1;
JobType job_type = 2;
string equipment_id = 3;
SnmpDevice device = 4;
repeated SnmpQuery queries = 5;
}
message SnmpDevice {
string ip = 1;
string community = 2;
string version = 3;
uint32 port = 4;
}
message SnmpQuery {
QueryType query_type = 1;
repeated string oids = 2;
}
message SnmpResult {
string equipment_id = 1;
JobType job_type = 2;
map<string, string> oid_values = 3;
int64 timestamp = 4;
}
message AgentHeartbeat {
string version = 1;
string hostname = 2;
uint64 uptime_seconds = 3;
string ip_address = 4;
}
message AgentError {
string equipment_id = 1;
string error_message = 2;
int64 timestamp = 3;
}