Mining/cmd/mining/cmd/install.go
Virgil 0671c60a1a
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
Align CLI naming with AX conventions
2026-04-04 06:49:40 +00:00

104 lines
2.8 KiB
Go

package cmd
import (
"fmt"
"runtime"
"time"
"forge.lthn.ai/Snider/Mining/pkg/mining"
"github.com/Masterminds/semver/v3"
"github.com/spf13/cobra"
)
var installCmd = &cobra.Command{
Use: "install [miner_type]",
Short: "Install or update a miner",
Long: `Download and install a new miner, or update an existing one to the latest version.`,
Args: cobra.ExactArgs(1),
RunE: func(_ *cobra.Command, args []string) error {
minerType := args[0]
var miner mining.Miner
switch minerType {
case "xmrig":
miner = mining.NewXMRigMiner()
default:
return fmt.Errorf("unknown miner type: %s", minerType)
}
installationDetails, err := miner.CheckInstallation()
if err == nil && installationDetails.IsInstalled {
latestVersionStr, err := miner.GetLatestVersion()
if err == nil {
latestVersion, err := semver.NewVersion(latestVersionStr)
if err == nil {
installedVersion, err := semver.NewVersion(installationDetails.Version)
if err == nil && !latestVersion.GreaterThan(installedVersion) {
fmt.Printf("%s is already installed and up to date (version %s).\n", miner.GetName(), installedVersion)
return nil
}
fmt.Printf("Updating %s from %s to %s...\n", miner.GetName(), installedVersion, latestVersion)
}
}
} else {
fmt.Printf("Installing %s...\n", miner.GetName())
}
if err := miner.Install(); err != nil {
return fmt.Errorf("failed to install/update miner: %w", err)
}
finalInstallationDetails, err := miner.CheckInstallation()
if err != nil {
return fmt.Errorf("failed to verify installation: %w", err)
}
fmt.Printf("%s installed successfully to %s (version %s).\n", miner.GetName(), finalInstallationDetails.Path, finalInstallationDetails.Version)
fmt.Println("Updating installation cache...")
if err := updateDoctorCache(); err != nil {
fmt.Printf("Warning: failed to update doctor cache: %v\n", err)
}
return nil
},
}
func updateDoctorCache() error {
serviceManager := getServiceManager()
availableMiners := serviceManager.ListAvailableMiners()
if len(availableMiners) == 0 {
return nil
}
var allDetails []*mining.InstallationDetails
for _, availableMiner := range availableMiners {
var miner mining.Miner
switch availableMiner.Name {
case "xmrig":
miner = mining.NewXMRigMiner()
default:
continue
}
details, err := miner.CheckInstallation()
if err != nil {
continue
}
allDetails = append(allDetails, details)
}
systemInfo := &mining.SystemInfo{
Timestamp: time.Now(),
OS: runtime.GOOS,
Architecture: runtime.GOARCH,
GoVersion: runtime.Version(),
AvailableCPUCores: runtime.NumCPU(),
InstalledMinersInfo: allDetails,
}
return saveInstalledMinerCache(systemInfo)
}
func init() {
rootCmd.AddCommand(installCmd)
}