zlh-agent/internal/provision/minecraft/neoforge.go
2025-12-13 20:54:18 +00:00

70 lines
1.9 KiB
Go

package minecraft
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"zlh-agent/internal/provcommon"
"zlh-agent/internal/state"
)
/* --------------------------------------------------------------------------
InstallMinecraftNeoForge
- Uses cfg.ArtifactPath as the NeoForge installer path
- Installs into /opt/zlh/minecraft/neoforge/world
----------------------------------------------------------------------------*/
func InstallMinecraftNeoForge(cfg state.Config) error {
dir := provcommon.ServerDir(cfg)
if err := os.MkdirAll(dir, 0o755); err != nil {
return fmt.Errorf("mkdir server dir: %w", err)
}
if cfg.ArtifactPath == "" {
return fmt.Errorf("artifact_path missing for neoforge install")
}
url := provcommon.BuildArtifactURL(cfg.ArtifactPath)
installerPath := filepath.Join(dir, "neoforge-installer.jar")
// Download NeoForge installer into server dir
cmdDl := exec.Command("bash", "-c",
fmt.Sprintf("cd %s && curl -fLo %s %q", dir, "neoforge-installer.jar", url),
)
cmdDl.Stdout = os.Stdout
cmdDl.Stderr = os.Stderr
fmt.Println("[neoforge] downloading installer from:", url)
if err := cmdDl.Run(); err != nil {
return fmt.Errorf("neoforge installer download failed: %w", err)
}
javaBin := filepath.Join(provcommon.JavaRoot, "java")
// Run NeoForge installer
cmd := exec.Command("/bin/bash", "-c",
fmt.Sprintf("cd %s && %s -jar %s --installServer", dir, javaBin, installerPath),
)
cmd.Env = append(os.Environ(),
"PATH=/opt/zlh/runtime:/opt/zlh/runtime/java:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
fmt.Println("[neoforge] running installer in", dir)
if err := cmd.Run(); err != nil {
return fmt.Errorf("neoforge installer failed: %w", err)
}
// Reuse same script patcher as Forge
if err := patchForgeJavaCalls(dir); err != nil {
return fmt.Errorf("patch java calls: %w", err)
}
return nil
}