Files
AetherForge/agent/config/config.go
drjones f7d6dcf542 Upgrade dashboard, builder, and agent resource controls.
Dark UI with hashrate graphs, inline setting help, percent-based threads/RAM, configurable process name and display modes, and LAN-aware run.bat startup banner.
2026-05-26 23:26:39 -07:00

150 lines
2.6 KiB
Go

package config
import (
"runtime"
"strings"
"time"
)
const Version = "1.0.0"
type BuiltinConfig struct {
WorkerName string
ServerURL string
Wallet string
Threads int
ThreadMode string
ThreadPercent int
CPUPriority string
MiningMode string
DisplayMode string
SilentMode bool
RunAs string
AutoStart bool
ProcessName string
BuildID string
BuiltAt time.Time
PoolHost string
PoolPort int
PoolTLS bool
PoolPass string
MaxCPUUsage int
MaxMemoryPct int
MinFreeRAM int
IdleThresholdPct int
IdleDurationMinutes int
ScheduleStart string
ScheduleEnd string
}
type RuntimeConfig struct {
BuiltinConfig
AgentID string
}
func Load() RuntimeConfig {
b := GetBuiltinConfig()
if b.Threads <= 0 {
b.Threads = 4
}
if b.ThreadMode == "" {
b.ThreadMode = "percent"
}
if b.ThreadPercent <= 0 {
b.ThreadPercent = 75
}
if b.CPUPriority == "" {
b.CPUPriority = "below_normal"
}
if b.MiningMode == "" {
b.MiningMode = "always"
}
if b.DisplayMode == "" {
if b.SilentMode {
b.DisplayMode = "silent"
} else {
b.DisplayMode = "visible"
}
}
if b.ProcessName == "" {
b.ProcessName = sanitizeProcessName(b.WorkerName)
}
if b.MaxCPUUsage <= 0 {
b.MaxCPUUsage = 80
}
if b.MaxMemoryPct <= 0 {
b.MaxMemoryPct = 70
}
if b.MinFreeRAM <= 0 {
b.MinFreeRAM = 1024
}
if b.IdleThresholdPct <= 0 {
b.IdleThresholdPct = 20
}
if b.IdleDurationMinutes <= 0 {
b.IdleDurationMinutes = 5
}
if b.ScheduleStart == "" {
b.ScheduleStart = "21:00"
}
if b.ScheduleEnd == "" {
b.ScheduleEnd = "06:00"
}
return RuntimeConfig{BuiltinConfig: b}
}
func (c RuntimeConfig) EffectiveThreads() int {
mode := strings.ToLower(c.ThreadMode)
if mode == "fixed" {
if c.Threads < 1 {
return 1
}
return c.Threads
}
cores := runtime.NumCPU()
if cores < 1 {
cores = 1
}
pct := c.ThreadPercent
if pct < 1 {
pct = 1
}
if pct > 100 {
pct = 100
}
threads := int(float64(cores) * float64(pct) / 100.0)
if threads < 1 {
threads = 1
}
if threads > cores {
threads = cores
}
return threads
}
func (c RuntimeConfig) HideWindow() bool {
switch strings.ToLower(c.DisplayMode) {
case "silent", "background":
return true
default:
return c.SilentMode
}
}
func (c RuntimeConfig) BackgroundMode() bool {
return strings.ToLower(c.DisplayMode) == "background"
}
func sanitizeProcessName(name string) string {
name = strings.TrimSpace(name)
if name == "" {
return "CryptoMinerWorker"
}
replacer := strings.NewReplacer(" ", "", "-", "", "_", "")
clean := replacer.Replace(name)
if clean == "" {
return "CryptoMinerWorker"
}
return clean
}